SimpleDateFormatter返回两个不同的时区

时间:2015-09-25 06:56:46

标签: java datetime time simpledateformat dst

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

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

4 个答案:

答案 0 :(得分:2)

我找到了解决方案。 我知道最好的解决方案是使用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

答案 1 :(得分:1)

2016年3月13日美国东部时间到美国东部时间的更改时间。所以SimpleDateFormat负责这一变化。

转到here

答案 2 :(得分:1)

差异是由夏令时造成的,2016年计划于2016年3月13日。在这里,您可以阅读一篇关于EDT and EST之间差异的简短文章。

答案 3 :(得分:1)

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。