关于日期类型显示格式问题
数据库中数据类型datetime
查询结果显示2023-05-25T07:00(不同的环境显示格式可能不一样)
有时候会发现没有秒
是因为数据库存储的本来也不是String格式,而是一个时间戳,在显示时需要经过toString转换,转换成什么格式就不一定了。
返回结果会封装到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());