Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleDataFormatter返回两个不同的时区_Java_Datetime_Time_Simpledateformat_Dst - Fatal编程技术网

Java SimpleDataFormatter返回两个不同的时区

Java SimpleDataFormatter返回两个不同的时区,java,datetime,time,simpledateformat,dst,Java,Datetime,Time,Simpledateformat,Dst,我有这两个字符串作为输入字符串 03/12/16 03/14/16 我创建了一个单一SimpleDataFormatter对象来获得这样的日期差 DateFormat formatter = new SimpleDateFormat("MM/dd/yy",Locale.US); Date dateChkIn = formatter.parse("03/12/16"); System.out.println("Checkin date at nights check - "+dateChkIn.

我有这两个字符串作为输入字符串

03/12/16
03/14/16
我创建了一个单一SimpleDataFormatter对象来获得这样的日期差

DateFormat formatter = new SimpleDateFormat("MM/dd/yy",Locale.US);
Date dateChkIn = formatter.parse("03/12/16");
System.out.println("Checkin date at nights check - "+dateChkIn.toString());
Date dateChkOut = formatter.parse("03/14/16");
System.out.println("Checkout date at nights check - "+dateChkOut.toString());
Long numberOfNghtsCalc = ((dateChkOut.getTime() - dateChkIn.getTime()) / 86400000L);
System.out.println("number of nigts calculated - "+ numberOfNghtsCalc);
下面是我在服务器中的输出

Checkin date at nights check - Sat Mar 12 00:00:00 EST 2016
Checkout date at nights check - Mon Mar 14 00:00:00 EDT 2016
number of nigts calculated - 1
预期输出为计算的NIGT数-2 请注意格式化程序返回的两个不同时区

更新:
2016年3月13日被视为DST变更日期。因此,我的计算是错误的。(除以86400000L)

在接下来的2016年3月13日,按美国东部标准时间改为美国东部标准时间。因此,
SimpleDateFormat
会处理此更改


Go

这一差异是由夏令时造成的,2016年夏令时计划为2016年3月13日。在这里,你可以阅读一篇关于两者区别的短文。

我找到了解决方案。我知道最好的解决方案是使用Joda时间。但在现有代码中改动最少的情况下,我认为这种巧妙的方法会更好。如果您发现任何缺点,请编辑此答案

    List<Date> dates = new ArrayList<Date>();
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(dateChkIn);

    Date result = null;
    while (calendar.getTime().before(dateChkOut)){
            result = calendar.getTime();


            dates.add(result);
            calendar.add(Calendar.DATE, 1);
    }
    System.out.println("DAYS CALCULATED BY NEW SOLUTION: " + dates.size());
    newNumberOfNghtsCalc = (long) dates.size();
    dates.clear();
List dates=new ArrayList();
日历=新的公历日历();
日历设置时间(dateChkIn);
日期结果=空;
while(calendar.getTime().before(dateChkOut)){
结果=calendar.getTime();
日期。添加(结果);
calendar.add(calendar.DATE,1);
}
System.out.println(“由新解决方案计算的天数:+dates.size());
newNumberOfNghtsCalc=(长)日期。大小();
日期。清除();
这实际上减少了运行时间

问题代码所用时间:275000(纳秒)

新解决方案所用时间:103000

java.Time 我建议您使用现代的,
java.time
date-time API

演示:

import java.time.Duration;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uu", Locale.ENGLISH);
        LocalDate dateChkIn = LocalDate.parse("03/12/16", dtf);
        LocalDate dateChkOut = LocalDate.parse("03/14/16", dtf);
        long days = ChronoUnit.DAYS.between(dateChkIn, dateChkOut);
        System.out.println(days);
    }
}
2
输出:

import java.time.Duration;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/uu", Locale.ENGLISH);
        LocalDate dateChkIn = LocalDate.parse("03/12/16", dtf);
        LocalDate dateChkOut = LocalDate.parse("03/14/16", dtf);
        long days = ChronoUnit.DAYS.between(dateChkIn, dateChkOut);
        System.out.println(days);
    }
}
2
了解现代日期时间API

  • 无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7
  • 如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认

首先使用Java 8的Time API或JodaTime来计算日期之间的差异。。。你有没有越过夏令时的边界?@MadProgrammer谢谢你的评论。但是我的系统使用的是Java1.5。此代码在我的生产环境中。一直以来,;它工作得很好。突然出现了这种情况。Joda Time支持Java 5,但您甚至可以使用
Calendar
尝试添加
formatter.setTimeZone(TimeZone.getTimeZone(“GMT”)下面的
SimpleDateFormat
您可以阅读此内容,我很抱歉。我对夏令时不太了解。这个问题在我们的产品中被报道过。我需要做任何代码级别的更改来处理这个问题吗?这是非常罕见的情况吗?我该如何告知我的美国客户?@JudeNiroshan:不罕见!每年,当更改EST->EDT和viceversa时,您都会遇到相同的问题。如果您使用不同的时区(即欧洲和美国),您会遇到相同的问题。但我的问题是,为什么SimpleDateFomatter返回两个不同的时区?美国东部时间12日和美国东部时间16日?@Jude:SimpleDateFormatter返回相同的时区,但该区域的时区会发生变化。因此,自卫队对这一变化是明智的。