如何使用JAX-RS在REST中将Javascript日期传递给Java LocalDate和LocalDateTime
当我将Javascript日期传递给JAX-RS服务时,我收到:如何使用JAX-RS在REST中将Javascript日期传递给Java LocalDate和LocalDateTime,javascript,java,angular,rest,jax-rs,Javascript,Java,Angular,Rest,Jax Rs,当我将Javascript日期传递给JAX-RS服务时,我收到: 如果目标字段是LocalDate:Text'2018-06-04T22:00:00.000Z'无法解析,则在索引10处找到未解析的文本。后端可以使用“2018-06-04”,我尝试了使用Postman 如果目标字段是LocalDateTime:Text'2019-04-02T20:16:24.999Z'无法解析,则在索引23处找到未解析的文本。后端可以使用“2019-04-02T20:16:24”,我尝试了使用Postman 我传
之前,我遇到了一个问题,因为服务器和客户端之间有1小时的差异。因此,当我过去从web服务器选择日期时,客户端可能会在组件上看到前一天,因为它是从午夜返回1小时。您似乎混淆了各种日期时间类型 ISO 8601
字符串
2018-06-04T22:00:00.000Z
为标准格式。末尾的Z
表示UTC,发音为Zulu
ISO 8601格式的设计很明智。它们很容易被机器解析。而且它们很容易被跨文化的人阅读。它们的主要目的是以文本格式传递日期时间值。您确实应该使用这些格式中的字符串在系统之间交换日期时间值
Instant
在java.time类中解析为一个类
LocalDate
该类表示一个只包含日期的值,不包含一天中的时间,也不包含或
时区对于确定日期至关重要。对于任何给定的时刻,全球各地的日期都因区域而异。例如,年午夜后几分钟是新的一天,而年仍然是“昨天”
如果未指定时区,JVM将隐式应用其当前默认时区。该默认时区可能在运行时(!),因此结果可能会有所不同。最好将所需/预期时区明确指定为参数。如果关键,请与用户确认该时区
请以大陆/地区
的格式指定a,如美国/蒙特利尔
,非洲/卡萨布兰卡
,或太平洋/奥克兰
。切勿使用2-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)
如果您想使用JVM的当前默认时区,请请求它并将其作为参数传递。如果省略,代码将变得模棱两可,我们无法确定您是否打算使用默认时区,或者您是否像许多程序员一样不知道这个问题
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
因此,您需要决定您希望将UTC中的某一时刻视为一天中的日期和时间的时区
仅日期值的ISO 8601格式为YYYY-MM-DD
String output = ld.toString() ; // Example: 2019-01-23
……还有
LocalDate ld = LocalDate.parse( "2019-01-23" ) ;
要在JavaScript中生成这样的字符串,请参阅
OffsetDateTime
如果希望UTC
本身,请将Instant
转换为OffsetDateTime
。然后单独提取日期
OffsetDateTime odt = instant.atOffset( ZoneOffsetUTC ) ; // Convert to the more flexible `OffsetDateTime` class from `Instant` class.
LocalDate ld = odt.toLocalDate() ; // Extract a date-only value.
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Adjust from UTC to a time zone.
LocalDate ld = zdt.toLocalDate() ; // Extract a date-only value, dropping the time-of-day and the time zone.
ZoneDateTime
如果需要特定时区,请应用ZoneId
以获取zoneDateTime
。然后单独提取日期
OffsetDateTime odt = instant.atOffset( ZoneOffsetUTC ) ; // Convert to the more flexible `OffsetDateTime` class from `Instant` class.
LocalDate ld = odt.toLocalDate() ; // Extract a date-only value.
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Adjust from UTC to a time zone.
LocalDate ld = zdt.toLocalDate() ; // Extract a date-only value, dropping the time-of-day and the time zone.
顺便说一句,请注意,ZonedDateTime
类在其toString
方法中通过在方括号中添加时区名称扩展了ISO 8601格式。这是一个明智的添加,但某些其他系统可能无法正确处理
LocalDateTime
LocalDateTime
类是错误的类型,用于输入,例如2018-06-04T22:00:00.000Z
或2019-04-02T20:16:24.999Z
。这些字符串输入表示时间线上的一个特定点。LocalDateTime
类故意缺少任何时区或偏移的概念,所以它不能代表一个时刻
人们经常误解LocalDateTime
的性质。“Local”是指任何地方或每个地方,但不是特定的地方。在特定的地方,使用ZoneDateTime
有关详细信息,请参阅
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,& 要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为 该项目现已启动,建议迁移到类 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
classes
Instant instant = Instant.parse( "2018-06-04T22:00:00.000Z" ) ;
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(字符串
可以通过2018-06-04T22:00:00.000Z
、Instant
和ZonedDateTime
正确解析。我建议使用OffsetDateTime
fZonedDateTime