如何使用JAXRS在REST中将Javascript日期传递给Java LocalDate和LocalDateTime
当我将Javascript日期传递给JAX-RS服务时,我收到:
- 如果目标字段是LocalDate:Text'2018-06-04T22:00:00.000Z'无法解析,则在索引10处找到未解析的文本。后端可以使用“2018-06-04”,我尝试了使用Postman
- 如果目标字段是LocalDateTime:无法分析文本“2019-04-02T20:16:24.999Z”,则在索引23处找到未分析的文本。后端“2019-04-02T20:16:24”还可以,我和邮递员试过了李>
我传递给后端的信息来自我映射到javascript日期对象上的Angular Material Datepicker组件
我知道该字符串包含后端不支持的信息,但我不知道如何在调用POST之前传递正确/修改的值
我应该传递字符串而不是日期对象吗?这是正确的方法吗
从格式为“2018-06-04T22:00:00.000Z”或“2018-06-05T00:00:00.000Z”的日期到LocalDate和LocalDateTime是否有传递方式
我使用LocalDate和LocalDateTime是因为我不想处理时区。 即使我更改了时区,值也应该始终相同
之前我遇到了一个问题,因为服务器和客户端之间有1小时的差异。因此,当我过去从web服务器选择日期时,客户端可能会在组件上看到前一天,因为它是从午夜返回1小时
# 1 楼答案
您似乎混淆了各种日期时间类型
ISO 8601
字符串
2018-06-04T22:00:00.000Z
采用标准ISO 8601格式。末尾的Z
表示UTC,发音为ZuluISO 8601格式的设计是明智的。它们很容易被机器解析。而且它们很容易被不同文化的人阅读。它们的主要目的是以文本格式传递日期时间值。您确实应该使用这些格式的字符串在系统之间交换日期时间值
Instant
在java中解析为^{} 。时间课程
LocalDate
^{} 类表示一个只包含日期的值,不包含一天中的时间,也不包含time zone或offset-from-UTC
时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,在Paris France午夜后几分钟是新的一天,而在Montréal Québec仍然是“昨天”
如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能在运行时(!)期间change at any moment,因此,您的结果可能会有所不同。最好将所需/预期时区明确指定为参数。如果关键,请与用户确认区域
以
Continent/Region
的格式指定一个proper time zone name,例如America/Montreal
、Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)如果要使用JVM的当前默认时区,请请求它并将其作为参数传递。如果省略,代码将变得模棱两可,我们无法确定您是否打算使用默认值,或者您是否像许多程序员一样不知道这个问题
因此,您需要决定您希望将UTC中的某一时刻视为一天中的日期和时间的时区
仅日期值的ISO 8601格式为YYYY-MM-DD
……还有
要在JavaScript中生成这样的字符串,请参见Format JavaScript Date to yyyy-mm-dd
OffsetDateTime
如果需要
UTC
本身,请将Instant
转换为OffsetDateTime
。然后单独提取日期ZonedDateTime
如果您想要一个特定的时区,请应用
ZoneId
来获得ZonedDateTime
。然后单独提取日期顺便说一句,请注意
ZonedDateTime
类的toString
方法通过在方括号中添加时区名称扩展了ISO 8601格式。一个明智的添加,但可能无法由其他一些系统正确处理LocalDateTime
LocalDateTime
类是用于2018-06-04T22:00:00.000Z
或2019-04-02T20:16:24.999Z
等输入的错误的类型。这些字符串输入表示一个时刻,时间线上的一个特定点。LocalDateTime
类故意缺少任何时区或偏移量的概念,因此它不能表示一个时刻人们经常误解
LocalDateTime
的性质。“本地”是指任何位置或每个位置,但不是特定位置。在特定位置使用ZonedDateTime
片刻有关更多信息,请参见What's the difference between Instant and LocalDateTime?
关于java。时间
java.time框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如^{} 、^{} 、&^{}
要了解更多信息,请参阅Oracle Tutorial。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310
现在位于maintenance mode的Joda-Time项目建议迁移到java.time类
您可以交换java。时间对象直接与数据库连接。使用符合JDBC 4.2或更高版本的JDBC driver。不需要字符串,也不需要
java.sql.*
类在哪里可以获得java。时间课
{a36}项目扩展了java。额外上课的时间。这个项目是将来可能添加到java的一个试验场。时间您可以在这里找到一些有用的类,例如^{} 、^{} 、^{} 和more