You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TimeStamp.valueOf()将字符串转TimeStamp末尾补0如何解决

核心原理说明

java.sql.Timestamp 属于时间数值类型,内部仅存储精确到纳秒的时间戳数值,本身不携带任何格式属性。你观察到的末尾带.0的表现,是该类默认toString()方法为了完整展示纳秒精度做的格式化输出,不影响对象本身的时间值。

你要求“最终数据类型为Timestamp且格式与原始字符串一致”本身是混淆了「时间数值类型」和「字符串格式化结果」的概念:只要你持有的是Timestamp类型对象,就不存在格式一说,只有当你把它转为字符串输出/序列化的时候才需要处理格式。


常见场景解决方案

场景1:需要将Timestamp存入数据库

无需做额外处理,只要数据库对应时间字段的精度设置为秒级,存储时会自动忽略纳秒部分,不会保存多余的.0精度,和你原始字符串的时间值完全一致。

场景2:需要输出符合yyyy-MM-dd HH:mm:ss格式的字符串

推荐用Java 8+提供的java.time包API完成转换和格式化,避免SimpleDateFormat的线程安全问题,示例代码如下:

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class TimeTest {
    public static void main(String[] args) {
        String myStr = "2021-08-25 09:46:26";
        // 先转LocalDateTime再转Timestamp
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime localDateTime = LocalDateTime.parse(myStr, formatter);
        Timestamp dateTime = Timestamp.valueOf(localDateTime);
        
        // 需要输出字符串时用formatter格式化即可,不会出现.0
        String formatResult = localDateTime.format(formatter);
        System.out.println(formatResult); // 输出:2021-08-25 09:46:26
    }
}

如果一定要用SimpleDateFormat,正确写法如下:

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeTest {
    public static void main(String[] args) throws Exception{
        String myStr = "2021-08-25 09:46:26";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf.parse(myStr);
        Timestamp dateTime = new Timestamp(date.getTime());
        
        // 输出时用sdf格式化,不要直接打印Timestamp对象
        System.out.println(sdf.format(dateTime)); // 输出:2021-08-25 09:46:26
    }
}

内容的提问来源于stack exchange,提问作者coco-candy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:39:01