如何在 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
。许多人发现这种行为非常令人困惑。但是,虽然你没有得到你要求的结果,但至少看起来你做到了。除了仍然打印时区缩写。
我在解析 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
。许多人发现这种行为非常令人困惑。但是,虽然你没有得到你要求的结果,但至少看起来你做到了。除了仍然打印时区缩写。