有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java计算特定时区中两个ZoneDateTime对象之间的天数?

我有下面的代码片段,其中有两个日期对象dates[0]dates[1]。两者都转换为GMT+10时区。我试图在GMT+10时区,而不是UTC,找到这两个日期之间的天数(逻辑日历天数)

我试过ChronoUnit.DAYS.between(),比如下面,但我相信它会先将日期转换为UTC(我希望下面打印1和0,但它打印0和0)

Date[] dates = new Date[2];
SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dates[1] = formatter.parse("2018-12-04T12:00:00");
dates[2] = formatter.parse("2018-12-04T16:00:00");
long toDate = 1543942800000L; \\2018-12-04T17:00:00
String timeZone = "GMT+10";
ZonedDateTime toDateZoned = ZonedDateTime.ofInstant(
    Instant.ofEpochMilli(toDate),
    ZoneId.of(timeZone)
);
for (Date ele: dates) {
    ZonedDateTime eleZoned = ZonedDateTime.ofInstant(
        ele.toInstant(),
        ZoneId.of(timeZone)
    );
    System.out.println(ChronoUnit.DAYS.between(eleZoned,toDateZoned));
}

如果我用

System.out.println(eleZoned);
System.out.println(toDateZoned);
System.out.println(ChronoUnit.DAYS.between(eleZoned, toDateZoned));

我得到以下输出

2018-12-04T22:00+10:00[GMT+10:00]
2018-12-05T03:00+10:00[GMT+10:00]
0
2018-12-05T02:00+10:00[GMT+10:00]
2018-12-05T03:00+10:00[GMT+10:00]
0

共 (1) 个答案

  1. # 1 楼答案

    如果需要日期之间的日历日,可以在调用between()之前将其转换为LocalDate

    Date[] dates = new Date[2];
    TimeZone tz = TimeZone.getTimeZone("GMT+10");
    SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    formatter.setTimeZone(tz);
    dates[0] = formatter.parse("2018-12-05T12:00:00");
    dates[1] = formatter.parse("2018-12-04T16:00:00");
    long toDate = 1543942800000L; //2018-12-04T17:00:00
    String timeZone = "GMT+10";
    ZonedDateTime toDateZoned = ZonedDateTime.ofInstant(
        Instant.ofEpochMilli(toDate),
        ZoneId.of(timeZone));
    for (Date ele: dates) {
      ZonedDateTime eleZoned = ZonedDateTime.ofInstant(
          ele.toInstant(),
          ZoneId.of(timeZone));
      System.out.println("Dates " + eleZoned + " " + toDateZoned);
      System.out.println(ChronoUnit.DAYS.between(eleZoned,toDateZoned));
      System.out.println(ChronoUnit.DAYS.between(eleZoned.toLocalDate(),toDateZoned.toLocalDate()));