代码之家  ›  专栏  ›  技术社区  ›  Arun Gowda

Jackson取消序列化日期忽略时间/将时间设置为0

  •  0
  • Arun Gowda  · 技术社区  · 3 年前

    下面是我的json对象列表:

    [
        {
            "Date": "2022-04-06T00:00:00"
        },
        {
            "Date": "2022-12-06T00:00:00"
        }
    ]
    

    和我的POJO:

    @Data
    public class MyPojo {
    
        @JsonProperty("Date")
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
        private Date date;
    }
    

    反序列化代码:

    public <T> List<T> toObjList(String json, Class<T> className) {
            try {
                return new ObjectMapper().readValue(json, objectMapper.getTypeFactory().constructCollectionType(List.class, className));
            } catch (Exception ex) {
                log.error("Exception converting json to Object: {}", json);
                throw new AppException("Exception while converting String to Object list", ex, HttpStatus.INTERNAL_SERVER_ERROR);
            }
        }
    
    

    我的问题是,尽管省略了 jsonFormat 模式,我看到一些随机的时间被添加到每个日期。我打印了序列化的日期,输出如下:

    (日期=2022年9月30日星期五IST 05:30:00)

    我试着用simleDateFormat解析一个日期,它似乎不包括时间。

    String input = "2022-09-30T00:00:00";
    SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd");
    Date date = parser.parse(input);
    System.out.println(date);
    

    这给出了预期的输出

    2022年9月30日星期五00:00:00 IST

    0 回复  |  直到 3 年前
        1
  •  3
  •   Basil Bourque    3 年前

    避免使用传统日期时间类

    可怕的 java.util.Date 阶级早在几年前就被现代社会所取代 java.time JSR310中定义的类。

    在该类的众多缺陷中 Date 用词不当。类表示从UTC偏移0小时-分-秒的时刻。所以它总是有一天中的某个时间,加上零的偏移量。

    java.time.LocalDate

    如果要表示只包含日期、不包含时间、不包含偏移量或时区的值,请使用现代类 java.time.LocalDate

    从瞬间确定日期

    当递给 日期类型 对象,立即转换为其现代替代品, java.time.Instant 。使用添加到旧类中的新转换方法。

    Instant instant = myJavaUtilDate.toInstant() ; 
    

    若要确定日期,必须指定时区。在任何特定时刻,全球各地的日期都会因时区而异。明天 Asia/Tokyo 在昨天同时 America/Edmonton

    ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  // Specify your time zone of interest.
    ZonedDateTime zdt = instant.atZone( z ) ;
    

    提取您想要的仅限日期的值。

    LocalDate ld = zdt.toLocalDate() ; 
    

    比较 LocalDate 对象使用 isEqual , isBefore isAfter 方法。

    搜索以了解更多信息。所有这些都已经在Stack Overflow上进行了多次报道。