如何使用JAX-RS在REST中将Javascript日期传递给Java LocalDate和LocalDateTime

如何使用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 我传

当我将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
  • 我传递给后端的信息来自我映射到javascript日期对象上的Angular Material Datepicker组件

    我知道该字符串包含后端不支持的信息,但我不知道如何在调用POST之前传递正确/修改的值

    我应该传递字符串而不是日期对象吗?这是正确的方法吗

    从格式为“2018-06-04T22:00:00.000Z”或“2018-06-05T00:00:00.000Z”的日期到LocalDate和LocalDateTime是否有传递方式

    我使用LocalDate和LocalDateTime是因为我不想处理时区。 即使我更改了时区,值也应该始终相同


    之前,我遇到了一个问题,因为服务器和客户端之间有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
        正确解析。我建议使用
        ZonedDateTime
        f