有 Java 编程相关的问题?

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

rest适当的Java类以UTC时区表示日期

我有一个Spring Boot(Jackson marshalling)REST api应用程序,在该应用程序中,我将把所有日期/时间(时间表的开始时间和结束时间)都视为在UTC时区。我应该在代码中使用什么“合适的”Java类来保存这些日期/时间?我觉得我们应该明确使用OffsetDateTime和内部时区作为UTC,以防我们需要切换时区或打印/记录日期等

想法?为了简单起见,LocalDateTime是否可以使用,因为它们都是UTC


共 (2) 个答案

  1. # 1 楼答案

    如果选择UTC作为时区中性表示(这是一个很好的想法),我建议从java.time中选择Instant。{}是一个时间点。从概念上讲,它没有时区。听起来这是一个优势。以后你可以随心所欲地切换时区,你的时间点将保持不变。可以使用UTC中的parse方法(例如2018-12-31T23:37:45.975Z)从ISO 8601字符串解析Instant。而且它的toString产生同样的结果,仍然是UTC

    如果希望明确表示日期时间是UTC,可以使用带有偏移量ZoneOffset.UTCOffsetDateTime。既然你说你的时代在UTC中总是,我会认为它是多余的。

  2. # 2 楼答案

    您需要使用ZonedDateTime。LocalDateTime没有任何区域信息(甚至UTC也没有)

    要使用jackson,您需要包括jsr310库,用于Java8日期/时间类的自动序列化/反序列化

    <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>
    

    另外,默认情况下ObjectMapperUTC区域解析日期/时间,这对您的情况很有帮助。 jsr310模块将由Spring boot自动注册。如果您想创建自己的ObjectMapper,您需要使用

    ObjectMapper mapper = new ObjectMapper();
    
    // will register all modules on classpath
    mapper.findAndRegisterModules();
    
    // only jsr310 module will be registered
    mapper.registerModule(new JavaTimeModule());