关于日期类型显示格式问题

最后更新:2024-05-01 09:20:13 | 状态:未完成
如 关于查询结果集中不显示秒的问题
数据库中数据类型datetime
查询结果显示2023-05-25T07:00(不同的环境显示格式可能不一样)
有时候会发现没有秒

是因为数据库存储的本来也不是String格式,而是一个时间戳,在显示时需要经过toString转换,转换成什么格式就不一定了。


这通过是跟LocalTime的显示有关,在秒=0时,秒不显示(小时与分无论是不是0都显示)
返回结果会封装到LocalDateTime类型中(其中又包含了一个LocalDate和一个LocalTime)

当然在给前端显示时不应该直接返回LocalDateTime类型 应该格式化成明确的String

比较简单的是可以注册一个Reader把所有日期类型自动格式化成String,注意这样就丢失了时区等信息
        DataReader reader = new DataReader() {
            @Override
            public Object read(Object value) {
                return DateUtil.format(DateUtil.parse(value), DateUtil.FORMAT_DATE_TIME);//格式化成String
            }
        };
        DataReaderFactory.reg(new Object[]{StandardTypeMetadata.DATETIME, "datetime", "timestamp", Date.class},reader); //按优先级TypeMetadata>SQL数据类型(String)> Java类型
        DataRow row = service.query("CRM_USER");
        System.out.println(row);

正常应该在显示环节再格式化

DataSet、DataRow中都提供了格式化的方法,如 set.format.date("yyyy-MM-dd HH:mm:ss", "JOIN_TIME", "WORK_TIME"...)

一般项目中会有JSON工具,在返回给前端时会经过JSON格式化,可以通过JSON工具统一配置
如jackson这样配置
ObjectMapper JSON_MAPPER = new ObjectMapper();
DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
JSON_MAPPER.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
JSON_MAPPER.setSerializationInclusion(JsonInclude.Include.ALWAYS);

// Include.Include.ALWAYS 默认
// Include.NON_DEFAULT 属性为默认值不序列化
// Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
// Include.NON_NULL 属性为NULL 不序列化

JSON_MAPPER.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
JSON_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JSON_MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
JSON_MAPPER.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false);

JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DATETIME_FORMATTER));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DATE_FORMATTER));
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(TIME_FORMATTER));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DATETIME_FORMATTER));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DATE_FORMATTER));
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(TIME_FORMATTER));
JSON_MAPPER.registerModule(javaTimeModule);
JSON_MAPPER.setTimeZone(TimeZone.getDefault());

首页 最近更新 搜索 提交 回复