如何将时间转换为秒数?使用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
相关产品推荐
相关产品推荐

