SimpleDateFormat returns 两个不同的时区

SimpleDateFormatter returns two different time zones

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

03/12/16
03/14/16

我制作了一个 单个 SimpleDateFormatter 对象来获得这样的日期差异

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

预期输出是 计算的 nigts 数 - 2 请注意从格式化程序返回的两个不同时区

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

在接下来的 2016 年 3 月 13 日,将美国东部时间更改为美国东部时间。所以 SimpleDateFormat 会处理此更改。

here

差异是由 夏令时造成的,2016 年夏令时定于 2016 年 3 月 13 日。在这里您可以阅读一篇关于 EDT and EST.

之间区别的简短文章

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

    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();

这实际上减少了 运行 时间!

问题代码所用时间:275000(以纳秒为单位)

新解决方案花费的时间:103000

java.time

我建议您使用现代 java.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

Trail: Date Time.

了解现代日期时间 API
  • 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它向后移植了大部分 java.time Java 6 和 7 的功能。
  • 如果您正在为 Android 项目工作,并且您的 Android API 水平仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring and