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

最后更新:2025-05-25 02:42:00 | 状态:未完成
如 关于查询结果集中不显示秒的问题
数据库中数据类型datetime
查询结果显示2023-05-25T07:00(不同的环境显示格式可能不一样)
可能会有两个问题:
1.输出时带T分隔符
2.有时候会发现没有秒

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

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

当然在给前端显示时不应该直接返回LocalDateTime类型 应该格式化成明确的String
因为datetime列对应java的LocalDateTime类型,也可以修改成其他类型,如StandardTypeMetadata.DATETIME.compatible(java.sql.Timestamp.class);

        Table table = ServiceProxy.metadata().table("tab_format");
        if(null != table){
            ServiceProxy.ddl().drop(table);
        }
        table = new Table("tab_format");
        table.addColumn("ID", "BIGINT").setAutoIncrement(true).setPrimary(true);
        table.addColumn("T1", "timestamp");
        table.addColumn("T2", "datetime");
        ServiceProxy.ddl().create(table);
        DataRow row = new DataRow();
        row.put("T1", new Date());
        row.put("T2", new Date());
        ServiceProxy.insert(table, row);
        row = ServiceProxy.query(table);
        Object t1 = row.get("T1");
        Object t2 = row.get("T2");
        //默认情况下 datetime列对应java的 LocalDateTime类型,LocalDateTime.toString()结果中会带T分隔符
        System.out.println("T1:"+t1.getClass() + " " + t1);
        System.out.println("T2:"+t2.getClass() + " " + t2);

        //可以通过StandardTypeMetadata.DATETIME对应的数据类型,Timestamp.toString()不带T分隔符
        StandardTypeMetadata.DATETIME.compatible(java.sql.Timestamp.class);
        row = ServiceProxy.query(table);
        t1 = row.get("T1");
        t2 = row.get("T2");
        System.out.println("T1:"+t1.getClass() + " " + t1);
        System.out.println("T2:"+t2.getClass() + " " + t2);

也可以注册一个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());

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