使用 Joda 的不同时区日期之间的天数

Days between to date of different timezone using Joda

我有一个格式为“2021-07-15T05:00:00.527+05:30”的输入日期字符串 我想要与当前时间不同的日期(当前时间为 UTC)。

DateTime inputDateTime = new DateTime(input, DateTimeZone.UTC);
DateTime now = new DateTime(DateTimeZone.UTC);
Days.daysBetween(now, inputDateTime).getDays();

如果我将输入日期转换为 UTC,则会产生错误的结果。 有什么方法可以从输入日期获取偏移量并将其添加到当前 UTC 日期,然后比较日期?

编辑:

抱歉问题措辞错误。我试图找出给定输入日期是今天还是 PreviousDay 还是明天是相对于 utc 时区的偏移量。

在服务器时间为2021-07-14T23:00:00.527Z时,以上输入的日期应取今天(即0)。 如果服务器时间是 2021-07-14T13:00:00.527Z,对于相同的输入数据,它应该是明天(即 1)。

编辑2:

我确实尝试过将两者都转换为 localDate, Days.daysBetween(now.toLocalDate(), inputDateTime.toLocalDate()).getDays() 但是当 UTC 时间在前一个日期 2021-07-14T23:00:00.527Z 和给定日期 2021-07-15T05:00:00.527+05:30 时,收益率为 1,但我希望它为 0 `

I am trying to check isToday or isTomorrow for given input string.

我建议:

    String input = "2021-07-19T05:00:00.527+05:30";
    
    DateTime inputDateTime = new DateTime(input, DateTimeZone.UTC);
    LocalDate inputDate = inputDateTime.toLocalDate();
    LocalDate today = LocalDate.now(DateTimeZone.UTC);
    boolean isToday = inputDate.equals(today);
    LocalDate tomorrow = today.plusDays(1);
    boolean isTomorrow = inputDate.equals(tomorrow);
    
    System.out.format("Is today? + %b; is tomorrow? %b.%n", isToday, isTomorrow);

刚才 运行 时的输出——大约 18:32 UTC 7 月 18 日:

Is today? + true; is tomorrow? false.

我以输入字符串2021-07-19T05:00:00.527+05:30为例。它等于 2021-07-18T23:30:00.527Z (UTC)。所以我比较今天和明天的日期是 2021-07-18.

java.time

来自 Joda-Time 主页的额外报价:

Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.

(Joda-Time - 主页;粗体为原创)

对应的java.time代码类似。只有从字符串到日期和时间的转换在文本上有所不同。它明确表示正在进行偏移转换,我认为这是一个优势:

    OffsetDateTime inputDateTime = OffsetDateTime.parse(input)
            .withOffsetSameInstant(ZoneOffset.UTC);
    LocalDate inputDate = inputDateTime.toLocalDate();
    LocalDate today = LocalDate.now(ZoneOffset.UTC);
    boolean isToday = inputDate.equals(today);
    LocalDate tomorrow = today.plusDays(1);
    boolean isTomorrow = inputDate.equals(tomorrow);

我现在使用 java.time 在我的代码中这样做了。我从输入日期中获取偏移量,将其添加到当前 utc 时间,然后获取两者的本地日期并进行比较。 不太确定这是否涵盖夏令时等场景。

    ZonedDateTime zonedScheduleDate = ZonedDateTime.parse(inputDate);
    ZoneId zone = zonedScheduleDate.getZone();
    ZonedDateTime instantAtUserTimezone = Instant.now().atZone(zone);
    return (int) DAYS.between(instantAtUserTimezone.toLocalDate(), zonedScheduleDate.toLocalDate());