gpt4 book ai didi

javascript - 如何在 js-joda 中比较 LocalDate 和 ZonedDateTime?

转载 作者:行者123 更新时间:2023-11-30 15:13:57 27 4
gpt4 key购买 nike

我正在寻找一种方法来比较 js-jodaLocalDateZonedDateTime 的实例,但这些类不兼容。我愿意接受,LocalDate 是时间和时区设置为零的 ZonedDateTime

比较这两个对象的最简单方法是什么?

最佳答案

LocalDate只有一个日期(日、月、年),而ZonedDateTime也有时间(小时、分钟、秒和纳秒)和时区。要比较它们,您必须选择将哪一个转换为另一个的类型。

正如 @Dummy's answer 已经解释的那样,一种方法是将 ZonedDateTime 转换为 LocalDate。假设我们有:

var z = ZonedDateTime.now(); // 2017-08-23T13:12:24.856-03:00[America/Sao_Paulo]
var dt = LocalDate.now(); // 2017-08-23

您可以使用方法equalsisBeforeisAfter 来检查本地日期(日/月/年)是否相同, 在另一个之前或之后

z.toLocalDate().equals(dt); // true
z.toLocalDate().isBefore(dt); // false
z.toLocalDate().isAfter(dt); // false

您还可以使用 compareTo ,如果第一个日期早于、等于或晚于第二个。

told in the comments 一样,调用 toLocalDate() 会丢弃时间和时区信息,只保留日期(日/月/年)。但是由于 LocalDate 只有这些字段,您不需要其他字段来进行比较。


要执行相反的操作(将 LocalDate 转换为 ZonedDateTime),您必须做出一些假设。根据您所在的时区,同一日期可以代表不同的时刻(现在在圣保罗是 8 月 23 日,但在东京是 8 月 24 日 - 您所在的时区选择可能会影响最终结果)。

您还需要定义此日期的时间(小时/分钟/秒/纳秒)。您告诉过您可以假设 LocalDate 是时间和时区设置为零的 ZonedDateTime。这意味着时间将为午夜 (00:00),时区将为 UTC(偏移量为零):

// consider LocalDate = ZonedDateTime with time and timezone set to zero (midnight in UTC)
var z2 = dt.atStartOfDay(ZoneOffset.UTC); // 2017-08-23T00:00Z

然后你可以比较:

z2.equals(z); // false: check if all fields are the same (date/time/timezone)
z2.isEqual(z); // false: check if both represent the same instant (even if timezones are different)
z2.isBefore(z); // true
z2.isAfter(z); // false
z2.compareTo(z); // -1

请注意,equals 检查所有字段是否相同(日期、时间和时区),而所有其他方法比较等效的 Instant(即使时区不同) ,对应的Instant用来做比较)。

在这种情况下,z22017-08-23T00:00Z(UTC 时间 2017 年 8 月 23 日 午夜),而 z2017-08-23T13:12:24.856-03:00[America/Sao_Paulo],在 UTC 中等同于 2017-08-23T16:12 :24.856Z(UTC 时间 2017 年 8 月 23 日 16:12:24.856)。

因此,equals 返回 false 因为时间和时区不同而 isEquals 返回 false 因为它们不相同' 代表相同的时刻(即使转换为 UTC,它们也是不同的)。 isBefore 返回 true 因为 z2 实际上在 z 之前(午夜 < 16:12)等等。


如果你想使用另一个时区而不是 UTC,你必须使用 js-joda-timezoneZoneId 类:

// get this date at midnight in London timezone
dt.atStartOfDay(ZoneId.of("Europe/London"));

API 使用 IANA timezones names(始终采用 Region/City 格式,例如 America/Sao_PauloEurope/Berlin)。避免使用 3 个字母的缩写(如 CSTPST),因为它们是 ambiguous and not standard

您可以通过调用 ZoneId.getAvailableZoneIds() 获取可用时区列表(并选择最适合您系统的时区)。

您还可以通过 ZoneId.systemDefault() 使用系统的默认时区,但这将取决于系统/浏览器,因此最好明确使用特定时区。

关于javascript - 如何在 js-joda 中比较 LocalDate 和 ZonedDateTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44734937/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com