如何在 js-joda 中比较 LocalDate 和 ZonedDateTime?
How to compare LocalDate with ZonedDateTime in js-joda?
我正在寻找一种方法来比较 js-joda
中 LocalDate
和 ZonedDateTime
的实例,但是 类 不兼容。我愿意接受 LocalDate
是时间和时区设置为零的 ZonedDateTime
。
比较这两个对象的最简单方法是什么?
你可以做到这一点
zonedDateTime.toLocalDate().compareTo(otherLocalDate)
其中returns-1
如果zonedDateTime
在[=13=之前],1
在otherLocalDate
之后,0
同
一个LocalDate
有只有一个日期(日、月、年),而ZonedDateTime
还有一个时间(时、分、秒)和纳秒)和时区。要比较它们,您必须选择将哪一个转换为另一个的类型。
正如 已经解释的那样,一种方法是将 ZonedDateTime
转换为 LocalDate
。假设我们有:
var z = ZonedDateTime.now(); // 2017-08-23T13:12:24.856-03:00[America/Sao_Paulo]
var dt = LocalDate.now(); // 2017-08-23
您可以使用方法 equals
、isBefore
或 isAfter
来检查本地日期 (day/month/year) 是否相同,在另一个之前或之后
z.toLocalDate().equals(dt); // true
z.toLocalDate().isBefore(dt); // false
z.toLocalDate().isAfter(dt); // false
您也可以使用 compareTo
,如果第一个日期早于、等于或晚于 return -1
、0
或 1
第二个
与 一样,调用 toLocalDate()
会丢弃时间和时区信息,只保留日期 (day/month/year)。但由于 LocalDate
只有这些字段,您不需要其他字段来进行比较。
要执行相反的操作(将 LocalDate
转换为 ZonedDateTime
),您必须做出一些假设。根据您所在的时区,同一日期可以代表不同的时刻(现在在圣保罗是 8 月 23 日,但在东京是 8 月 24[=102] =] - 您选择的时区可能会影响最终结果。
并且您还需要定义此日期的时间 (hour/minute/second/nanosecond)。您告诉过您可以假设 LocalDate 是时间和时区设置为零的 ZonedDateTime。这意味着 time 将是午夜 (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
用来做比较)。
在这种情况下,z2
是 2017-08-23T00:00Z
(UTC 时间 2017 年 8 月 23th 午夜),而 z
是 2017-08-23T13:12:24.856-03:00[America/Sao_Paulo]
,在 UTC 中相当于 2017-08-23T16:12:24.856Z
(2017 年 8 月 23th 在 16:12:24.856 在 UTC)。
所以,equals
returns false
因为时间和时区不同 isEquals
returns false
因为他们不' 代表相同的时刻(即使转换为 UTC,它们也是不同的)。 isBefore
returns true
因为 z2
实际上是在 z
之前(午夜 < 16:12)等等。
如果你想使用另一个时区而不是 UTC,你必须使用 js-joda-timezone 和 ZoneId
class:
// get this date at midnight in London timezone
dt.atStartOfDay(ZoneId.of("Europe/London"));
API 使用 IANA timezones names(格式总是 Region/City
,如 America/Sao_Paulo
或 Europe/Berlin
)。
避免使用 3 个字母的缩写(如 CST
或 PST
),因为它们是 ambiguous and not standard.
您可以通过调用 ZoneId.getAvailableZoneIds()
.
获取可用时区列表(并选择最适合您的系统的时区)
您还可以将系统的默认时区与 ZoneId.systemDefault()
一起使用,但这将取决于 system/browser,因此最好明确使用特定时区。
我正在寻找一种方法来比较 js-joda
中 LocalDate
和 ZonedDateTime
的实例,但是 类 不兼容。我愿意接受 LocalDate
是时间和时区设置为零的 ZonedDateTime
。
比较这两个对象的最简单方法是什么?
你可以做到这一点
zonedDateTime.toLocalDate().compareTo(otherLocalDate)
其中returns-1
如果zonedDateTime
在[=13=之前],1
在otherLocalDate
之后,0
同
一个LocalDate
有只有一个日期(日、月、年),而ZonedDateTime
还有一个时间(时、分、秒)和纳秒)和时区。要比较它们,您必须选择将哪一个转换为另一个的类型。
正如 ZonedDateTime
转换为 LocalDate
。假设我们有:
var z = ZonedDateTime.now(); // 2017-08-23T13:12:24.856-03:00[America/Sao_Paulo]
var dt = LocalDate.now(); // 2017-08-23
您可以使用方法 equals
、isBefore
或 isAfter
来检查本地日期 (day/month/year) 是否相同,在另一个之前或之后
z.toLocalDate().equals(dt); // true
z.toLocalDate().isBefore(dt); // false
z.toLocalDate().isAfter(dt); // false
您也可以使用 compareTo
,如果第一个日期早于、等于或晚于 return -1
、0
或 1
第二个
与 toLocalDate()
会丢弃时间和时区信息,只保留日期 (day/month/year)。但由于 LocalDate
只有这些字段,您不需要其他字段来进行比较。
要执行相反的操作(将 LocalDate
转换为 ZonedDateTime
),您必须做出一些假设。根据您所在的时区,同一日期可以代表不同的时刻(现在在圣保罗是 8 月 23 日,但在东京是 8 月 24[=102] =] - 您选择的时区可能会影响最终结果。
并且您还需要定义此日期的时间 (hour/minute/second/nanosecond)。您告诉过您可以假设 LocalDate 是时间和时区设置为零的 ZonedDateTime。这意味着 time 将是午夜 (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
用来做比较)。
在这种情况下,z2
是 2017-08-23T00:00Z
(UTC 时间 2017 年 8 月 23th 午夜),而 z
是 2017-08-23T13:12:24.856-03:00[America/Sao_Paulo]
,在 UTC 中相当于 2017-08-23T16:12:24.856Z
(2017 年 8 月 23th 在 16:12:24.856 在 UTC)。
所以,equals
returns false
因为时间和时区不同 isEquals
returns false
因为他们不' 代表相同的时刻(即使转换为 UTC,它们也是不同的)。 isBefore
returns true
因为 z2
实际上是在 z
之前(午夜 < 16:12)等等。
如果你想使用另一个时区而不是 UTC,你必须使用 js-joda-timezone 和 ZoneId
class:
// get this date at midnight in London timezone
dt.atStartOfDay(ZoneId.of("Europe/London"));
API 使用 IANA timezones names(格式总是 Region/City
,如 America/Sao_Paulo
或 Europe/Berlin
)。
避免使用 3 个字母的缩写(如 CST
或 PST
),因为它们是 ambiguous and not standard.
您可以通过调用 ZoneId.getAvailableZoneIds()
.
您还可以将系统的默认时区与 ZoneId.systemDefault()
一起使用,但这将取决于 system/browser,因此最好明确使用特定时区。