有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

当我将Javascript日期传递给JAX-RS服务时,我收到:

  1. 如果目标字段是LocalDate:Text'2018-06-04T22:00:00.000Z'无法解析,则在索引10处找到未解析的文本。后端可以使用“2018-06-04”,我尝试了使用Postman
  2. 如果目标字段是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) 个答案

  1. # 1 楼答案

    您似乎混淆了各种日期时间类型

    Table of date-time types in Java, both legacy and modern.

    ISO 8601

    字符串2018-06-04T22:00:00.000Z采用标准ISO 8601格式。末尾的Z表示UTC,发音为Zulu

    ISO 8601格式的设计是明智的。它们很容易被机器解析。而且它们很容易被不同文化的人阅读。它们的主要目的是以文本格式传递日期时间值。您确实应该使用这些格式的字符串在系统之间交换日期时间值

    Instant

    java中解析为^{}。时间课程

    Instant instant = Instant.parse( "2018-06-04T22:00:00.000Z" ) ;
    

    LocalDate

    ^{}类表示一个只包含日期的值,不包含一天中的时间,也不包含time zoneoffset-from-UTC

    时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,在Paris France午夜后几分钟是新的一天,而在Montréal Québec仍然是“昨天”

    如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能在运行时(!)期间change at any moment,因此,您的结果可能会有所不同。最好将所需/预期时区明确指定为参数。如果关键,请与用户确认区域

    Continent/Region的格式指定一个proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)

    ZoneId z = ZoneId.of( "America/Montreal" ) ;  
    LocalDate today = LocalDate.now( z ) ;
    

    如果要使用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中生成这样的字符串,请参见Format JavaScript Date to yyyy-mm-dd

    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.
    

    ZonedDateTime

    如果您想要一个特定的时区,请应用ZoneId来获得ZonedDateTime。然后单独提取日期

    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.000Z2019-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 modeJoda-Time项目建议迁移到java.time

    您可以交换java。时间对象直接与数据库连接。使用符合JDBC 4.2或更高版本的JDBC driver。不需要字符串,也不需要java.sql.*

    在哪里可以获得java。时间课

    {a36}项目扩展了java。额外上课的时间。这个项目是将来可能添加到java的一个试验场。时间您可以在这里找到一些有用的类,例如^{}^{}^{}more