LocalDateTime时间格式化

文章展示了一个Java示例,说明如何创建一个自定义的`ChineseLocalDateTimeDeserializer`,该类继承自`LocalDateTimeDeserializer`,并使用`DateTimeFormatter`来处理不同格式的时间字符串,如年、年-月、年-月-日等,将其格式化为`LocalDateTime`对象。默认填充未提供的小时、分钟和秒。
摘要由CSDN通过智能技术生成

需求:传入的时间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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值