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

LocalTime解析时截断秒值问题求助(非JSON映射场景)

问题描述

我遇到的问题和某个Stack Overflow问题类似,但那个问题没有解决方案,而且我不是在处理JSON映射场景。用LocalTime.parse解析时间字符串时,秒部分为00的话会被截断,测试代码如下:

public class LocalTimeIssue {
  public static void main(String[] args) {
    Time someSQLTimeWithZero = new Time(1715264820000L); //09:27:00
    printTime(someSQLTimeWithZero); //09:27

    Time someSQLTimeWithNoZero = new Time(1715264821000L); //09:27:01
    printTime(someSQLTimeWithNoZero); //09:27:01
  }

  private static void printTime(Time someSQLTime) {
    String strTime = someSQLTime.toString();
    LocalTime someLocalTime = LocalTime.parse(strTime, DateTimeFormatter.ofPattern("HH:mm:ss"));
    System.out.println(someLocalTime);
  }
}
解决办法

原因分析

问题不在解析环节,而是LocalTime的默认toString()方法会自动省略为0的秒数。另外java.sql.Time的toString()在秒为0时也会省略该部分,不过DateTimeFormatter的宽松模式能兼容这种不带秒的字符串,所以解析后的LocalTime对象其实是包含秒数0的,只是打印时被默认格式简化了。

两种可行方案

  1. 强制指定格式化输出
    直接打印LocalTime对象会用默认格式,改成指定HH:mm:ss格式输出,就能始终显示秒部分:
private static void printTime(Time someSQLTime) {
    String strTime = someSQLTime.toString();
    LocalTime someLocalTime = LocalTime.parse(strTime, DateTimeFormatter.ofPattern("HH:mm:ss"));
    // 用指定格式强制输出秒数
    System.out.println(DateTimeFormatter.ofPattern("HH:mm:ss").format(someLocalTime));
}
  1. 跳过字符串解析,直接类型转换
    java.sql.Time自带toLocalTime()方法,直接转换更高效,也能避免字符串格式带来的问题:
private static void printTime(Time someSQLTime) {
    LocalTime someLocalTime = someSQLTime.toLocalTime();
    System.out.println(DateTimeFormatter.ofPattern("HH:mm:ss").format(someLocalTime));
}

内容的提问来源于stack exchange,提问作者αƞjiβ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:52:07