LocalDateTime时间格式化

需求:传入的时间String,使用Jackson格式化为LocalDateTime对象。

用例:允许以下情况

2023
2023-12
2023-03-02
2023-03-02 12
2023-03-02 12:13
2023-03-02 12:13:24

期望结果:

2023-01-01T00:00
2023-12-01T00:00
2023-03-02T00:00
2023-03-02T12:00
2023-03-02T12:13
2023-03-02T12:13:24

使用DateTimeFormatter

public class ChineseLocalDateTimeDeserializer extends LocalDateTimeDeserializer {

    private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
            .appendPattern("yyyy[-MM][-dd][ HH[:mm][:ss]]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
            .toFormatter();

    public ChineseLocalDateTimeDeserializer() {
        super(DATE_TIME_FORMATTER);
    }
}

示例:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;

/**
 * @author CloudStyle
 **/
public class Main {
    public static void main(String[] args) {
        // 创建ObjectMapper对象
        ObjectMapper objectMapper = new ObjectMapper();

        try {
            // 测试不同的时间格式
            String jsonString0 = "{\"myTime\":\"2023\"}";
            DateObject dateObject0 = objectMapper.readValue(jsonString0, DateObject.class);
            System.out.println(dateObject0.getMyTime());

            // 测试不同的时间格式
            String jsonString00 = "{\"myTime\":\"2023-12\"}";
            DateObject dateObject00 = objectMapper.readValue(jsonString00, DateObject.class);
            System.out.println(dateObject00.getMyTime());

            // 测试不同的时间格式
            String jsonString1 = "{\"myTime\":\"2023-03-02\"}";
            DateObject dateObject1 = objectMapper.readValue(jsonString1, DateObject.class);
            System.out.println(dateObject1.getMyTime());

            String jsonString2 = "{\"myTime\":\"2023-03-02 12\"}";
            DateObject dateObject2 = objectMapper.readValue(jsonString2, DateObject.class);
            System.out.println(dateObject2.getMyTime());

            String jsonString3 = "{\"myTime\":\"2023-03-02 12:13\"}";
            DateObject dateObject3 = objectMapper.readValue(jsonString3, DateObject.class);
            System.out.println(dateObject3.getMyTime());

            String jsonString4 = "{\"myTime\":\"2023-03-02 12:13:24\"}";
            DateObject dateObject4 = objectMapper.readValue(jsonString4, DateObject.class);
            System.out.println(dateObject4.getMyTime());
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

    public static class DateObject {
        @JsonDeserialize(using = ChineseLocalDateTimeDeserializer.class)
        private LocalDateTime myTime;

        public LocalDateTime getMyTime() {
            return myTime;
        }

        public void setMyTime(LocalDateTime myTime) {
            this.myTime = myTime;
        }
    }

    public static class ChineseLocalDateTimeDeserializer extends LocalDateTimeDeserializer {

        private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
                .appendPattern("yyyy[-MM][-dd][ HH[:mm][:ss]]")
                .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
                .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                .toFormatter();

        public ChineseLocalDateTimeDeserializer() {
            super(DATE_TIME_FORMATTER);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值