如何在Java中将字符串时间转换为长整型毫秒数

3

我试图使用下面的代码将时间字符串转换为毫秒。因为我将使用这个时间作为倒计时计时器。

问题在于,时间来自数据库,它是varchar类型的。我尝试了这段代码,但它没有给我正确的输出结果。

String timeDuration = "10:00"; //for example only
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
Date time = sdf.parse(timeDuration);
long millis = time.getTime(); //The output must be 600000

使用这段代码时我得到了错误的“millis”数值。

我正在使用Android Studio。


你得到了什么输出? - Unmitigated
6
以冒号为分割符,将两个值转换为整数类型,将左侧的值乘以60后加上右侧的值,然后将结果乘以1000。 - luk2302
对我来说,输出是 600000 - Unmitigated
1
按照 @luk2302 的建议执行,或者从拆分操作的结果构建一个 java.time.Duration 对象,并在该对象上调用 .toMillis() 方法。 - deHaar
@luk2302,你说得对,谢谢伙计。 - Kroi
3个回答

5

Duration不同于Date-Time

Duration和Date-Time不同,因此您不应该将字符串解析为Date-Time类型。Date-Time类型(例如java.util.Date)表示时间点,而持续时间表示一段时间长度。您可以从以下示例中了解到:

  1. 我已经阅读这本书10分钟了。
  2. 我一直在阅读这本书下午4:00 开始。

第一个示例具有持续时间,而第二个示例具有Date-Time(隐含为今天)。

java.time

java.util Date-Time API及其格式化API SimpleDateFormat 已经过时且容易出错。建议完全停止使用它们并切换到现代的Date-Time API*

使用现代的Date-Time API java.time的解决方案:

您可以将字符串转换为ISO 8601格式的Duration,然后将结果字符串解析成Duration,然后可以将其转换为毫秒。

演示:

import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        System.out.println(durationToMillis("10:00"));
    }

    static long durationToMillis(String strDuration) {
        String[] arr = strDuration.split(":");
        Duration duration = Duration.ZERO;
        if (arr.length == 2) {
            strDuration = "PT" + arr[0] + "M" + arr[1] + "S";
            duration = Duration.parse(strDuration);
        }
        return duration.toMillis();
    }
}

输出:

600000

在线演示

Trail: Date Time了解有关现代日期时间 API 的更多信息。


1
很好地解释了区别。 - anubhava

2
使用 SimpleDateFormat 和 Date 类是非常不鼓励的。这些类已经被弃用并且存在很多问题。请改用 java.time 包代替。对于解析器,请使用 DateTimeFormatter 类。此外,在您的情况下,您可以使用 Duration 类。或者,您可以使用开源 MgntUtils 库,该库具有 TimeInterval 类和方法 TextUtils.parseStringToTimeInterval(java.lang.String valueStr)。在这种情况下,您的代码可能非常简单:
long milliseconds = TextUtils.parseStringToTimeInterval("10m").toMillis();

这将会给你一个结果为600000。该库可作为Maven构件在此处获取,也可在Github上获取(包括源代码和Javadoc)在此处。这是一个Javadoc的链接。关于该库的文章在这里(请参见“将字符串解析为时间间隔”一段)。 免责声明:该库由我编写。

-5

我认为你可以先截取子字符串,然后将其转换为整数,再乘以60000。

Integer.parseInt(timeDuration.substring(0, timeDuration.indexOf(":"))) * 60 * 1000

希望有所帮助

祝好,

Hook


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接