Sla*_* II 3 javascript datetime-comparison zoneddatetime js-joda localdate
我正在寻找一种方法来比较LocalDate和ZonedDateTimein的实例js-joda,但这些类不兼容。我愿意接受,这LocalDate是ZonedDateTime时间和时区设置为零的情况。
比较这两个对象的最简单方法是什么?
小智 5
ALocalDate只有日期(日、月、年),而 A也有时间(小时、分钟、秒和纳秒)和时区。ZonedDateTime要比较它们,您必须选择将哪一种类型转换为另一种类型。
正如@Dummy\'s 的答案已经解释的那样,一种方法是将 转换ZonedDateTime为LocalDate. 假设我们有:
var z = ZonedDateTime.now(); // 2017-08-23T13:12:24.856-03:00[America/Sao_Paulo]\nvar dt = LocalDate.now(); // 2017-08-23\nRun Code Online (Sandbox Code Playgroud)\n\n您可以使用方法equals,isBefore或isAfter检查本地日期(日/月/年)是否相同、早于或晚于其他日期
z.toLocalDate().equals(dt); // true\nz.toLocalDate().isBefore(dt); // false\nz.toLocalDate().isAfter(dt); // false\nRun Code Online (Sandbox Code Playgroud)\n\n您还可以使用compareTo,它可以返回-1,0或者1第一个日期早于、等于或晚于第二个日期。
正如评论中所述,调用toLocalDate()会丢弃时间和时区信息,仅保留日期(日/月/年)。但由于 LocalDate只有这些字段,因此您不需要其他字段来进行比较。
要执行相反的操作(将 转换LocalDate为 a ZonedDateTime),您必须做出一些假设。根据您所在的时区,相同的日期可能代表不同的时刻(现在在 S\xc3\xa3o 保罗是 8 月 23 日,但在东京是 8 月 24 日-您选择的时区可能会影响最终结果)。
您还需要定义该日期的时间(小时/分钟/秒/纳秒)。您告诉您可以假设LocalDate 是一个 ZonedDateTime ,其中时间和时区设置为零。这意味着时间将为午夜 (00:00),时区将为 UTC(偏移量为零):
\n\n// consider LocalDate = ZonedDateTime with time and timezone set to zero (midnight in UTC)\nvar z2 = dt.atStartOfDay(ZoneOffset.UTC); // 2017-08-23T00:00Z\nRun Code Online (Sandbox Code Playgroud)\n\n然后你可以比较一下:
\n\nz2.equals(z); // false: check if all fields are the same (date/time/timezone)\nz2.isEqual(z); // false: check if both represent the same instant (even if timezones are different)\nz2.isBefore(z); // true\nz2.isAfter(z); // false\nz2.compareTo(z); // -1\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,equals检查所有字段是否相同(日期、时间和时区),而所有其他方法则比较等效值Instant(即使时区不同,Instant也会使用相应的值进行比较)。
在本例中,z2is 2017-08-23T00:00Z(UTC 时间 2017 年 8 月 23 日午夜),而zis 2017-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-timezone和ZoneId类:
// get this date at midnight in London timezone\ndt.atStartOfDay(ZoneId.of("Europe/London"));\nRun Code Online (Sandbox Code Playgroud)\n\nAPI 使用IANA 时区名称(始终采用 格式Region/City,如America/Sao_Paulo或Europe/Berlin)。\n避免使用 3 个字母缩写(如CST或PST),因为它们不明确且不标准。
您可以通过调用 获取可用时区列表(并选择最适合您的系统的时区)ZoneId.getAvailableZoneIds()。
您还可以使用系统的默认时区ZoneId.systemDefault(),但这将取决于系统/浏览器,因此最好明确使用特定的时区。
| 归档时间: |
|
| 查看次数: |
6392 次 |
| 最近记录: |