java - Android 以毫秒为单位转换时间

标签 java android time datetime-format milliseconds

我已经检查了有关以毫秒为单位转换时间的问题,并且我遵循了所有答案,但我仍然得到错误的小时数,尽管分钟和秒都可以。

在我的应用程序中,用户必须从 TimePickerDialog 中选择一个时间并在 TextView 中设置时间。例如,它将在时钟中显示 01:30。它会显示 502125000222:30:00

我的代码TimePickerDialog:

 TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        Calendar mycalendar  = Calendar.getInstance();
        mycalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
        mycalendar.set(Calendar.MINUTE, minute);
        mycalendar.set(Calendar.SECOND, 0);

        long times = mycalendar.getTimeInMillis();

         //  hmsTimeFormatter is a method return time format
        String timerRemaind =  hmsTimeFormatter(times);

             //tv_remaindertime is TextView 

           tv_remaindertime.setText(timerRemaind); 
          ............

还有这个转换毫秒的hmsTimeFormatter方法:

private String hmsTimeFormatter(long milliSeconds) {

    String hms = String.format("%02d:%02d:%02d",
        TimeUnit.MILLISECONDS.toHours(milliSeconds),
        TimeUnit.MILLISECONDS.toMinutes(milliSeconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliSeconds)),
        TimeUnit.MILLISECONDS.toSeconds(milliSeconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliSeconds)));

    return hms;
}

最佳答案

了解正在发生的事情:

  • Calendar.getInstance() 使用 JVM 默认时区中的当前日期/时间创建一个 Calendar
  • 您设置小时、分钟和秒(我想是 01:30:00)
  • 您调用 getTimeInMillis(),它返回自 unix 纪元 (1970-01-01T00:00Z) 以来的毫秒数

然后您将此毫秒值与 TimeUnit 一起使用,但这不是您需要的。 TimeUnit 会将毫秒数视为时间量,但您需要的是一天中的某个时间:

  • 一天中的时间是一天中的特定时刻,例如“上午 10 点”“下午 5 点 30 分” .
  • 一个时间量就是耗时量,例如“10 分45 秒”,或“2 年, 4 个月 5 天 17 小时”,但它没有附加到特定时间点(“10 分钟相对于什么?”);这只是时间本身。

虽然这两个概念可能使用相同的词(“小时”、“分钟”、“秒”等),但它们并不是一回事。

TimeUnit 处理时间量,因此它会进行像“1000 秒等于多少分钟?”这样的转换。
示例:TimeUnit.MILLISECONDS.toHours(value) 返回等于 value 毫秒的小时数(不是一天中的时间)。由于您使用的值是 getTimeInMillis() 的结果,因此您将获得自 1970 年 1 月以来的总小时数。

通过将 getTimeInMillis()(表示特定时间点)的结果与 TimeUnit 一起使用,您误用了该值,将其视为一个数量时间。

要格式化日期,您可以使用 SimpleDateFormat:

Calendar mycalendar = Calendar.getInstance();
mycalendar.set(Calendar.HOUR_OF_DAY, 1);
mycalendar.set(Calendar.MINUTE, 30);
mycalendar.set(Calendar.SECOND, 0);

// format: hour:minute:second
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String hms = sdf.format(mycalendar.getTime()); // 01:30:00

这样,hms 的值将是 01:30:00Check the javadoc了解格式 HH:mm:ss 的含义,以便在需要不同格式时更改它(例如,如果您只需要 01:30,格式将为 HH:mm)。


Java 新日期/时间 API

旧类(DateCalendarSimpleDateFormat)有lots of problemsdesign issues ,并且它们正在被新的 API 取代。

在 Android 中,您可以使用 ThreeTen Backport ,Java 8 的新日期/时间类的一个很好的反向移植。要使其正常工作,您还需要 ThreeTenABP (更多关于如何使用它的信息 here)。

首先您创建一个 org.threeten.bp.LocalTime(一个表示一天中的时间的类),然后您使用 org.threeten.bp.format 对其进行格式化。日期时间格式化程序:

// create time for 01:30
LocalTime time = LocalTime.of(1, 30);
// format: hour:minute:second
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm:ss");
String hms = fmt.format(time);
System.out.println(hms); // 01:30:00

此外,check the javadoc适用于所有可用格式。

关于java - Android 以毫秒为单位转换时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46424297/

相关文章:

android - 检查应用程序是否正在运行 - Kotlin

java - ImageLoaderConfiguration.Builder 类型未定义方法 enableLogging()

java - system.nanoTime() 错误吗?

java - 使用带有 Android SDK 的 Graph API 将图片上传到 Facebook

java - 如何更改 Eclipse 中的工作区?

java - 尝试从 .data 文件获取值并将它们存储到 int[][] 数组中

JAVA:在 Jframe GUI 中将用户输入保存为字符串

android - 亚马逊是否具有与 Android 应用程序的谷歌许可证相同的 API?

haskell - sleep 直到下一分钟开始

具有 NULL 时间的 Javascript Date() 对象