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

如何将时间转换为秒数?使用SimpleDateFormat遇负值问题

问题分析与解决方法

问题原因

你用SimpleDateFormat解析时长字符串时得到负数,核心原因是:SimpleDateFormat是用于处理「日期时间」的工具,不是专门处理「时长」的。

当你传入00:00:10.000这类字符串时,它会默认将这个时间关联到1970年1月1日的本地时区时间。如果你的本地时区在UTC以西(比如美国、欧洲部分地区),这个本地时间对应的UTC时间其实是1969年12月31日,而Unix时间戳(从1970-01-01 00:00:00 UTC开始计算的毫秒数)在这之前是负数,所以最终得到的秒数自然也是负数。


解决方案

方案1:使用Java 8+的Duration类(推荐)

Java 8引入的java.time包提供了专门处理时长的Duration类,比过时的SimpleDateFormat更可靠、清晰。

方式A:直接解析时分秒字段

import java.time.Duration
import java.time.format.DateTimeFormatter
import java.time.temporal.ChronoField

fun String.convertTimeIntoSeconds(): Long {
    val formatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSS")
    val temporal = formatter.parse(this)
    
    val hours = temporal.get(ChronoField.HOUR_OF_DAY).toLong()
    val minutes = temporal.get(ChronoField.MINUTE_OF_HOUR).toLong()
    val seconds = temporal.get(ChronoField.SECOND_OF_MINUTE).toLong()
    val millis = temporal.get(ChronoField.MILLI_OF_SECOND).toLong()
    
    return Duration.ofHours(hours)
        .plusMinutes(minutes)
        .plusSeconds(seconds)
        .plusMillis(millis)
        .seconds
}

方式B:转成ISO-8601时长格式解析

把HH:mm:ss.SSS格式转换为Duration支持的ISO-8601格式(如PT00H00M10.000S),再直接解析:

import java.time.Duration

fun String.convertTimeIntoSeconds(): Long {
    // 替换格式为ISO-8601时长标准
    val isoDuration = "PT${this.replace(":", "H", 1).replace(":", "M")}S"
    return Duration.parse(isoDuration).seconds
}

方案2:兼容旧API(设置UTC时区)

如果必须使用SimpleDateFormat,只需将其时区强制设置为UTC,这样解析的时间会对应1970-01-01 00:00:00 UTC之后的时间,时间戳就会是正数:

import java.text.SimpleDateFormat
import java.util.*

fun String.convertTimeIntoSeconds(): Long {
    val dateFormat = SimpleDateFormat("HH:mm:ss.SSS")
    dateFormat.timeZone = TimeZone.getTimeZone("UTC") // 关键:指定UTC时区
    val date = dateFormat.parse(this) ?: return 0
    return date.time / 1000L
}

内容的提问来源于stack exchange,提问作者WISHY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:27:38