计算带有时区的java中两个日期之间的天数

时间:2017-03-30 10:33:49

标签: java date timezone

根据this question,我计算了java中两个日期之间的天数。 该计划位于

之下
SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy");
String inputString1 = "23 01 1997";
String inputString2 = "27 04 1997";

try {
    Date date1 = myFormat.parse(inputString1);
    Date date2 = myFormat.parse(inputString2);
    long diff = date2.getTime() - date1.getTime();
    System.out.println ("Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
} catch (ParseException e) {
    e.printStackTrace();
}

但是,当日期属于夏令时区时,我遇到了问题。喜欢EDT到EST。例如,当我们计算(2017年3月1日)至2017年3月30日之间的天数时,实际计数应为29,但上述计划的结果为28。

3 个答案:

答案 0 :(得分:2)

您可以使用LocalDate

System.out.println(
        Period.between(
                LocalDate.parse("2017-03-01"), 
                LocalDate.parse("2017-03-30")
        ).getDays()
); // 29

或使用dd M yyyy格式:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd M yyyy");
LocalDate localDate = LocalDate.parse("01 03 2017",dateTimeFormatter);
LocalDate localDate1 = LocalDate.parse("30 03 2017",dateTimeFormatter);
System.out.println(Period.between(localDate,localDate1).getDays());

答案 1 :(得分:0)

使用java 8 new Date Time APi

    import java.time.*;
    import java.time.temporal.*;

    ZonedDateTime z1 = date1.toInstant().atZone(ZoneId.systemDefault());
    ZonedDateTime z2 = date2.toInstant().atZone(ZoneId.systemDefault());
    long diff = ChronoUnit.DAYS.between(z1, z2);  // 29

答案 2 :(得分:-1)

您可能需要的是在对其进行差异之前将日期转换为相同的时区。时区代码看起来应该是这样的 -

myFormat.setTimeZone(TimeZone.getTimeZone( “EST”));