【问题标题】:Calculating days between two dates in java with time zone用时区计算java中两个日期之间的天数
【发布时间】:2017-08-24 05:27:59
【问题描述】:

根据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。例如,当我们计算 (MAR 01, 2017) 到 (MAR 30, 2017) 之间的天数时,实际计数应该是 29,但上述程序的结果是 28。

【问题讨论】:

  • 使用 LocalDate 代替 Date
  • 如果您使用的是 java 8,请使用 ZonedDateTime
  • 您的问题不清楚:您想知道两个时刻之间的 24 小时时间段数吗?或者您想知道两个日期之间经过的天数?完全不是一回事。一大区别:夏令时与日期和整日无关。
  • @BasilBourque 我们的生产环境是Linux,机器本地时区是EST5EDT。我的程序的逻辑是,在创建业务对象时,将使用名为 start_date 的日期(2017 年 3 月 1 日)初始化日历对象,并在执行一些业务逻辑后返回另一个名为 event_date 的日期为(2017 年 3 月 1 日)的日历对象.现在根据业务逻辑需要计算 start_date 和 event_date 之间的天数。要计算 start_date 和 event_date 之间的天数,应用的逻辑如下
  • ((event_date.getTimeInMillis() - start_date.getTimeInMillis())/86400000) 这给出了错误的结果,我也试过了。TimeUnit.DAYS.convert(event_date.getTimeInMillis() - start_date.getTimeInMillis (), TimeUnit.MILLISECONDS)。如上所述,这也给出了错误的结果。我最后的解决方法是 ((event_d ((event_date.getTimeInMillis()/86400000 - start_date.getTimeInMillis()/86400000))。这没有问题。

标签: java date timezone


【解决方案1】:

您可能需要将日期转换为相同的时区,然后再对其进行比较。时区代码应如下所示 -

myFormat.setTimeZone(TimeZone.getTimeZone("EST"));

【讨论】:

    【解决方案2】:

    使用 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
    

    【讨论】:

    • 谢谢@Sharon。此代码在 java 8 中给出了预期的输出,但我使用的是 java 6 并找到了解决问题的替代方法。 date2.getTime()/86400000 - date1.getTime()/86400000
    • @SivshaShankar 旧的日期时间类是一团糟;避免他们。请改用 java.time 类,因为它们是为了取代遗留类而发明的。大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 2015-01-16
      • 2015-02-26
      相关资源
      最近更新 更多