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

如何在Java中解析DialogFlow日期(@sys.time-period),java,date,dialogflow-es,Java,Date,Dialogflow Es,我在用Java解析DialogFlow日期时遇到问题。 DialogFlow允许我们使用词语来描述日期周期实体,如“平安夜”、“下午”、“下周”等(请参阅) 但是,当我使用“圣诞夜”这样的术语时,Dialogflow v2返回以下对象: {“开始日期”:“2019-12-25T12:00:00-05:00”,“结束日期”:“2019-12-18T12:00:00-05:00”} 为什么我们要在“平安夜”返回那个时段 那么,使用LocalDateTime解析没有偏移量的日期的最佳方法是什么? 例如

我在用Java解析DialogFlow日期时遇到问题。 DialogFlow允许我们使用词语来描述日期周期实体,如“平安夜”、“下午”、“下周”等(请参阅)

但是,当我使用“圣诞夜”这样的术语时,Dialogflow v2返回以下对象: {“开始日期”:“2019-12-25T12:00:00-05:00”,“结束日期”:“2019-12-18T12:00:00-05:00”}

为什么我们要在“平安夜”返回那个时段

那么,使用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());
但是,新日期调整为返回“Wed Dec 25 07:00:00 EST 2019” 如何解决此问题以在不指定特定时区的情况下删除偏移量?

您已经在那里了 您对
LocalDateTime
的解析是正确的。而一个
LocalDateTime
就是:一个没有时区的日期和时间。这不正是你想要的吗?那就留着它,忘掉关于
Date
类的一切吧。它的设计很差,而且已经过时很久了

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

    Instant myInstant = date.atZone(ZoneId.systemDefault()).toInstant();
    Date myDate = Date.from(myInstant);
    System.out.println(myDate);
示例输出:

2019年12月25日星期三美国东部时间12:00:00

date
是问题代码中的
LocalDateTime

我利用了一个事实,
Date
获取JVM的默认时区,并使用它来呈现它从
toString()
返回的字符串,当我们打印
日期时隐式调用该字符串。许多人觉得这种行为相当令人困惑。虽然你没有得到你要求的结果,但至少看起来你得到了。除了时区缩写还在打印。

您已经在那里了 您对
LocalDateTime
的解析是正确的。而一个
LocalDateTime
就是:一个没有时区的日期和时间。这不正是你想要的吗?那就留着它,忘掉关于
Date
类的一切吧。它的设计很差,而且已经过时很久了

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

    Instant myInstant = date.atZone(ZoneId.systemDefault()).toInstant();
    Date myDate = Date.from(myInstant);
    System.out.println(myDate);
示例输出:

2019年12月25日星期三美国东部时间12:00:00

date
是问题代码中的
LocalDateTime



我利用了一个事实,
Date
获取JVM的默认时区,并使用它来呈现它从
toString()
返回的字符串,当我们打印
日期时隐式调用该字符串。许多人觉得这种行为相当令人困惑。虽然你没有得到你要求的结果,但至少看起来你得到了。除了时区缩写仍然打印。

使用
OffsetDateTime
进行解析?使用
OffsetDateTime
,我不需要硬编码偏移吗?如何在不硬编码的情况下删除偏移量?您的日期字符串的偏移量为
-5:00
,您不需要硬编码任何内容。我不是必须说我的偏移量为“-5:00”吗?这是硬编码。如果日期的偏移量改变了怎么办?我不知道你说的是什么意思。你用那个偏移量硬编码了字符串?不那么这不是硬编码。使用
OffsetDateTime
进行解析?使用
OffsetDateTime
,我不需要硬编码偏移吗?如何在不硬编码的情况下删除偏移量?您的日期字符串的偏移量为
-5:00
,您不需要硬编码任何内容。我不是必须说我的偏移量为“-5:00”吗?这是硬编码。如果日期的偏移量改变了怎么办?我不知道你说的是什么意思。你用那个偏移量硬编码了字符串?不那就不是“硬编码”了。他用TZOffset获得时间,直接解析成
LocalDateTime
是不对的,因为当LocalOffset与字符串中的任何偏移量不匹配时,就会中断。这里最严格的方法是解析成
分区
偏移量
,然后转换成系统默认值TZ保持不变,然后再从那里执行
toLocalDateTime()
。@M.Prokhorov我希望时间保持为“12:00:00”,我知道提问者不想保留时间点,但确切的日期和时间。也许他能纠正我。只是我自己会把一个“夏娃”看成是有时间成分的东西,因此是一个偏移。但是有一个选项可以使用
ISO\u OFFSET\u TIME
进行解析,但是可以将其解析为
LocalDateTime
,忽略偏移量。但这件事确实需要很多澄清才能正确。谢谢@Ole V.V.,这有助于消除时区。我会接受这个答案,并尝试让Dialogflow团队中的人用不正确的日期周期来回答这个问题。提示,在接受答案之前请等待几天。没有公认答案的问题往往会得到更多的关注,我认为其他人添加我没有写的东西也不会太晚。(当然,最终接受答案是一种很好的方式。)他在TZOffset中获得了时间,直接解析成
LocalDateTime
是不对的,因为当LocalOffset发生时,这会中断