- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种方法来比较 js-joda
中 LocalDate
和 ZonedDateTime
的实例,但这些类不兼容。我愿意接受,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
您可以使用方法equals
、isBefore
或isAfter
来检查本地日期(日/月/年)是否相同, 在另一个之前或之后
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
用来做比较)。
在这种情况下,z2
是 2017-08-23T00:00Z
(UTC 时间 2017 年 8 月 23 日 午夜),而 z
是 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
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()
使用系统的默认时区,但这将取决于系统/浏览器,因此最好明确使用特定时区。
关于javascript - 如何在 js-joda 中比较 LocalDate 和 ZonedDateTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44734937/
我创建了两个 ZonedDateTime 对象,我认为它们应该相等: public static void main(String[] args) { ZoneId zid = ZoneId.
假设我有一个 ZonedDateTime: ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), ZoneI
给定以下单元测试: @Test public void zonedDateTimeCorrectlyRestoresItself() { // construct a new instance
我正在尝试将 ZonedDateTime 与以下代码进行比较: val now = ZonedDateTime.now() val query = for { x Timestamp.from(
我最近迁移到 Java 8,希望能更轻松地处理本地和分区时间。 但是,在我看来,在解析简单日期时,我遇到了一个简单的问题。 public static ZonedDateTime convertirA
您好,我已经搜索过类似的问题,但没有成功。我正在调用一个 ws,它将一个 token 发回给我,当它是有效的示例时: { "token": ..., "notBefore":"Thu 21
我有一个 ZonedDateTime 对象,我想根据给定的区域设置对其进行格式化。 IE。在美国,我希望格式为“M-dd-yy”,但在英国则应为“dd-M-yy”。 在给定的语言环境下执行此操作的最佳
在比较 ZonedDateTimes 时,使用 和 == 并不总是与使用 .isBefore、.isAfter 和 isEqual 相同,如下面的 Kotlin 示例所示: import java.
我有以下功能 public String getDateAndTimeInUserFormat(String value, DateTimeFormat inputFormat) { retu
我的时间以毫秒为单位,我需要将其转换为 ZonedDateTime 对象。 我有以下代码 long m = System.currentTimeMillis(); LocalDateTime d =
我尝试将字符串转换为 ZonedDateTime。这是我的代码: String startTime = "Wed Mar 21 2018 08:00:00 GMT 0330 (IRST)"; Stri
在比较 ZonedDateTimes 时,使用 和 == 并不总是与使用 .isBefore、.isAfter 和 isEqual 相同,如下面的 Kotlin 示例所示: import java.
我正在尝试获取存储为 UTC 的日期时间并将其转换为给定时区的日期时间。据我所知,ZonedDateTime 是正确的(“美国/芝加哥”比 UTC 晚 5 小时),但 DateTimeFormatte
我需要将字符串 2020-04-15T23:00:00+0000 转换为 ZonedDateTime。我尝试了以下方法,但没有成功: DateTimeFormatter formatter = Dat
如何将已设置的 ZonedDateTime 时间更改为“java.time.LocalTime.MIN”或“java.time.LocalTime.MAX”? ZonedDateTime date =
我正在尝试将字符串转换为 ZonedDateTime。 我尝试过以下操作: SimpleDateFormat zonedDateTimeFormat = new SimpleDateFormat("y
我目前正在研究日期在英国夏令时间之内和之外时的 ZonedDateTime 行为。 英国夏令时间从 3 月 25 日开始,增加一小时 (+1)。 我创建了几个 ZonedDateTime 实例(UTC
ZonedDateTime zdt3 = ZonedDateTime.parse("1999-09-09 09:09:09.999", DateTimeFormatter.of
我有一个返回年、月、日和小时的 DTO。因此将值从 DTO 传递到 ZonedDateTime.of 方法。此处,时间显示为太平洋标准时间上午 10 点。因此,尝试将其转换为 UTC。 当传递月份为
String ip="2011-05-01T06:47:35.422-05:00"; ZonedDateTime mzt = ZonedDateTime.parse(ip).toInstant().a
我是一名优秀的程序员,十分优秀!