【问题标题】:How to convert String time to Long milliseconds in Java如何在Java中将字符串时间转换为长毫秒
【发布时间】:2021-09-24 12:03:22
【问题描述】:

我正在尝试使用下面的代码将时间字符串转换为毫秒。因为我会把时间用作倒计时。

问题是时间来自数据库并且是 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

我用这个代码得到了错误的“毫”。

我正在使用 Android Studio。

【问题讨论】:

  • 你得到什么输出?
  • :处拆分,从两个值中创建一个int,将左边的值乘以60,将其与右边的值相加,然后将所有值乘以1000。
  • 我的输出是600000
  • 按照@luk2302 所说的去做,或者从拆分操作的结果中构建一个java.time.Duration 并在该持续时间对象上调用.toMillis()
  • @luk2302 你说得对,谢谢老兄

标签: java java-time duration


【解决方案1】:

持续时间与日期时间不同

持续时间与日期时间不同,因此您不应将字符串解析为日期时间类型。 Date-Time 类型(例如java.util.Date)表示时间点,而持续时间表示时间长度。你可以从下面的例子中理解:

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

第一个例子有一个持续时间,而第二个例子有一个日期时间(隐含今天)。

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

使用现代日期时间 API java.time 的解决方案:

您可以将您的字符串转换为ISO 8601 format for a 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

ONLINE DEMO

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

【讨论】:

  • 很好解释的区别
【解决方案2】:

非常强烈不鼓励使用 SimpleDateFormat 和 Date 类。这些类已被弃用并且非常有问题。请改用包 java.time。解析器使用DateTimeFormatter 类。此外,在您的情况下,您可以使用Duration 类。或者,您可以使用具有类TimeInterval 和方法TextUtils.parseStringToTimeInterval(java.lang.String valueStr) 的开源MgntUtils 库。在这种情况下,您的代码可能非常简单:

long milliseconds = TextUtils.parseStringToTimeInterval("10m").toMillis();

这将给你 600000 作为结果。该库以 Maven 工件 here 和 github(包括源代码和 Javadoc)here 的形式提供。这是Javadoc 的链接。关于该库的文章是here(参见段落“Parsing String to Time Interval”)

免责声明:图书馆是我写的

【讨论】:

    【解决方案3】:

    我认为您可以先剪切子字符串。然后将子字符串转换为整数。然后乘以 60000。

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

    HTH

    干杯,

    挂钩

    【讨论】:

      猜你喜欢
      • 2016-08-01
      • 2013-02-17
      • 1970-01-01
      • 2013-03-02
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2019-08-03
      相关资源
      最近更新 更多