【问题标题】:from Calendar to ChronoLocalDateTime从日历到 ChronoLocalDateTime
【发布时间】:2018-11-25 22:15:50
【问题描述】:

我想知道 LocalDateTime 是否在昨天之后,所以我进行了比较,但我不知道如何从 Calendar 传递到 ChronoLocalDateTime

final Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
lastClientEvent.getDateReceived().isAfter(cal);

【问题讨论】:

  • 当您可以使用现代 Java 日期和时间 API java.time 时,没有理由也使用像 Calendar 这样过时的类。 java.time 提供您需要的所有功能(例如,如 the answer by YCF_L 所示)。
  • 作为 Ole V.V.评论说,传统的日期时间类完全被现代 java.time 类所取代。您的问题试图将传统与现代相结合是有缺陷的。您无需再碰CalendarDate 课程。要与尚未针对 java.time 更新的旧代码交互,请在旧遗留类上调用新的转换方法来来回转换。但是只在 java.time 中编写所有新代码。
  • 另一件事,如果您正在跟踪实际时刻,则不应使用LocalDateTime。该类故意缺少任何时区或与 UTC 偏移的概念。因此,它不能代表片刻。它代表大约 26-27 小时(时区范围)范围内的潜在时刻。对于实际时刻,您应该使用InstantZonedDateTimeInstant.now() 捕获 UTC 中的当前时刻。 ZonedDateTime.now( ZoneId ) 捕获特定地区(时区)人们使用的挂钟时间中看到的当前时刻。

标签: java date time java-time localdate


【解决方案1】:

我不确定你所说的昨天到底是什么意思,如果你的意思是昨天,你可以使用今天午夜之前的任何日期:

LocalDateTime yesterday = LocalDateTime.of(
        LocalDate.now(ZoneId.of("Europe/Madrid")),
        LocalTime.MIDNIGHT
); 
=> 2018-06-16T00:00

如果您是指昨天的昨天午夜,您可以使用minusDays(1)

LocalDateTime yesterday = LocalDateTime.of(
        LocalDate.now(ZoneId.of("Europe/Madrid")),
        LocalTime.MIDNIGHT
).minusDays(1);
=> 2018-06-15T00:00

然后你可以用这个比较你的日期:

LocalDateTime anyDate = LocalDateTime.of(2018, Month.JUNE, 16, 9, 27, 50);
if (anyDate.isAfter(yesterday)) { }

您可以使用@Ole V.V. 的另一个解决方案:

LocalDateTime anyDate = LocalDateTime.of(2018, Month.JUNE, 16, 9, 27, 50);
LocalDate zoneDate = LocalDate.now(ZoneId.of("Europe/Madrid"));
if (anyDate.toLocalDate().isAfter(zoneDate)) { }

【讨论】:

  • 不错的正确答案。除非切割时间是“24 小时前”,否则我可能会使用anyDate.toLocalDate() 来获得LocalDate,然后将其与例如LocalDate.now(ZoneId.of("Europe/Madrid"))(今天在西班牙)进行比较。
  • 谢谢@OleV.V。很高兴从 OP 的名称中检测到 OP 来自西班牙 :) 我编辑我的答案希望这就是你的意思
  • 是的,我就是这么想的(谷歌翻译感谢提问者的个人资料页面中的文字是加泰罗尼亚语,所以我想,当然 en Peris 可能生活在地球上的任何地方)。跨度>
  • 谢谢@OleV.V.
【解决方案2】:

你可以这样转换:

final Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
Date ts = cal.getTime();
Instant instant = Instant.ofEpochMilli(ts.getTime());
LocalDateTime yesterday = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

if(lastClientEvent.getDateReceived().isAfter(yesterday){..}

【讨论】:

  • 不是一个好的答案。 (A) 忽略时区的关键问题。 (B) 不必要地使用非常麻烦的遗留日期时间类,这些类在几年前被现代 java.time 类所取代。
  • @BasilBourque The other answer报告了使用新Java日期API的方法。这个答案应该是为了完成 OP 的代码。
  • 很好。我的评论是对读者的警告,这些类现在已经过时了。我没有投反对票。我要指出问题中的缺陷——如果作者有权访问 java.time 框架,则根本不应该使用这些遗留类。永远不要将传统和现代课程混为一谈,这是毫无意义的。
猜你喜欢
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
相关资源
最近更新 更多