如何在 Java 中解析 DialogFlow 日期(@sys.time-句点)

How to parsing DialogFlow dates (@sys.time-period) in Java

我在解析 Java 中的 DialogFlow 日期时遇到问题。 DialogFlow 允许我们使用单词来描述日期期间的实体,例如 "Christmas Eve"、"afternoon"、"next week" 等(参见 https://cloud.google.com/dialogflow/docs/reference/system-entities

但是,当我使用像 "Christmas Eve" 这样的术语时,Dialogflow v2 return 会出现以下对象: {"startDate": "2019-12-25T12:00:00-05:00", "endDate" : "2019-12-18T12:00:00-05:00"}.

为什么 DialogFlow return 那段时间 "Christmas Eve"?

那么,使用 LocalDateTime 解析没有偏移量的日期的最佳方法是什么? 例如,给定“2019-12-25T12:00:00-05:00”,我希望时间保持为“12:00:00”

我尝试使用以下代码:

DateTimeFormatter isoDateFormatter = DateTimeFormatter.ISO_DATE_TIME;
LocalDateTime date = LocalDateTime.parse(dateStr, isoDateFormatter);
Date myDate = Date.from(date.atZone(ZoneId.of("UTC")).toInstant());

不过,新日期调整为return "Wed Dec 25 07:00:00 EST 2019" 如何解决此问题以在不指定特定时区的情况下删除偏移量?

你已经到了

您对 LocalDateTime 的解析是正确的。 LocalDateTime 就是这样:没有时区的日期和时间。这不正是你想要的吗?然后保留它并忘记关于 Date class 的一切。它的设计很糟糕,而且已经过时了。

如果你需要一个老式的java.util.Date作为遗产API

有时我们确实需要 Date 用于尚未升级到 java.time 的遗留 API、现代 Java 日期和时间 API。不幸的是,Date 不是没有时区的日期和时间。相反,它是一个时间点(但没有时区好吧)。我们只能假装。我们确实需要为转换指定时区或偏移量。

    Instant myInstant = date.atZone(ZoneId.systemDefault()).toInstant();
    Date myDate = Date.from(myInstant);
    System.out.println(myDate);

示例输出:

Wed Dec 25 12:00:00 EST 2019

date 是问题代码中的 LocalDateTime

我正在利用 Date 获取 JVM 默认时区并将其用于从 toString() 呈现字符串 returns 的事实,这在我们打印时隐式调用Date。许多人发现这种行为非常令人困惑。但是,虽然你没有得到你要求的结果,但至少看起来你做到了。除了仍然打印时区缩写。