使用时区计算java中两个日期之间的天数

使用时区计算java中两个日期之间的天数,java,date,timezone,Java,Date,Timezone,根据,我用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.pars

根据,我用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();
}

但是当日期在夏时制时区时,我遇到了一些问题。喜欢美国东部夏令时到东部夏令时。例如,当我们计算从(2017年3月1日)到(2017年3月30日)之间的天数时,实际计数应该是29,但上述程序的结果是28。

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

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

使用java 8


您可以使用
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());

如果您正在使用java 8,请使用LocalDate而不是Dateuse ZonedDateTime您的问题不清楚:您想知道两个时刻之间24小时的时间段数吗?或者您想知道两个日期之间经过的天数?一点也不一样。一个很大的区别是:夏令时与日期和全天无关。@BasilBourque我们的生产环境是Linux,机器本地时区是EST5EDT。我的程序的逻辑是,在创建业务对象时,将使用日期(2017年3月1日)初始化日历对象,称为开始日期,在执行一些业务逻辑后,它将返回另一个日期为(2017年3月1日)的日历对象,称为事件日期。现在,根据业务逻辑,需要计算开始日期和事件日期之间的天数。要计算开始日期和事件日期之间的天数,应用的逻辑如下((event\u date.getTimeInMillis()-start\u date.getTimeInMillis())/86400000)这给出了错误的结果,我也尝试了.TimeUnit.days.convert(event\u date.getTimeInMillis()-start\u date.getTimeInMillis(),TimeUnit.millis)。这也给出了如上所述的错误结果。我最后的解决方法是((event_d((event_date.getTimeInMillis()/86400000-start_date.getTimeInMillis()/86400000))。这没有问题。谢谢@Sharon。这段代码在java 8中提供了预期的输出,但我使用java 6并找到了解决问题的替代方法。date2.getTime()/86400000-date1.getTime()/86400000@SivishaShankar旧的遗留日期时间类一团糟;避免使用它们。改用java.time类,因为它们是为了取代遗留类而发明的。java.time的大部分功能在中被重新移植到java 6和7,并在中进一步适应Android。
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());