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

Java 计算特定时区中两个ZoneDateTime对象之间的天数?,java,Java,我有以下代码片段,其中有两个日期对象dates[0]和dates[1]。两者都转换为GMT+10时区。我试图在GMT+10时区中查找这两个日期之间的天数(逻辑日历天数),而不是UTC 我已经尝试了ChronoUnit.DAYS.between(),比如下面,但我相信它会首先将日期转换为UTC(我希望下面打印1和0,但它打印0和0) 如果我将最后一条打印语句替换为 System.out.println(eleZoned); System.out.println(toDateZoned); Syst

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

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

如果我将最后一条打印语句替换为

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

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


您需要设置SimpleDataFormat的时区,以确保它在正确的时区中解析日期。@jtahlborn这不重要,因为它正在转换为for循环中
TimeZone
时区中的ZonedDateTime对象。右侧?日期和历元毫秒有效地“分区”了日期时间(在UTC区域中)。为了获得正确的历元值,您必须使用正确的时区分析本地日期时间。注意,在将日期转换为ZonedDateTime实例后,您可以通过在循环中输出这些日期来轻松验证是否正确分析了日期。是的,我相信它们的分析是正确的;如果我添加
System.out.println(eleZoned)我得到了预期的输出
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
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()));