使用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
相关产品推荐
相关产品推荐

