Android 以毫秒为单位转换时间

Android converting the time in milliseconds

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

在我的应用程序中,用户必须 select 来自 TimePickerDialog 的时间并在文本视图中设置时间。例如,它将在时钟中显示 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;
}

您好,使用功能强大的库怎么样?它非常简单实用, 它使您免于排队 Joda-Time

用法: Gradle配置:

compile 'joda-time:joda-time:2.9.9'

更多信息和文档:

https://github.com/JodaOrg/joda-time

http://www.joda.org/joda-time/

编码愉快!

如果我没理解错的话,你想将毫秒转换为 HH:mm:ss。 为此,我们使用 SimpleDateFormat

private String hmsTimeFormatter(long milliSeconds) {

    Date date = new Date(milliSeconds);
    SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
    return format.format(date);
}

试一试并将格式语法更改为您喜欢的格式

要了解正在发生的事情:

  • Calendar.getInstance() 在 JVM 默认时区
  • 中使用当前 date/time 创建一个 Calendar
  • 你设置了小时、分钟和秒(我想是01:30:00
  • 你调用getTimeInMillis(),即returns自unix纪元(1970-01-01T00:00Z)
  • 以来的毫秒数

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

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

尽管这两个概念可能使用相同的词("hours"、"minutes"、"seconds" 等),但它们不是一回事。

TimeUnit 处理时间量,因此它会进行类似 “1000 秒等于多少分钟?”.
的转换 示例:TimeUnit.MILLISECONDS.toHours(value) returns 小时数 相当于 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新Date/TimeAPI

旧的 classes(DateCalendarSimpleDateFormat)有 lots of problems and design issues,它们正在被新的 APIs.

在 Android 中您可以使用 ThreeTen Backport, a great backport for Java 8's new date/time classes. To make it work, you'll also need the ThreeTenABP (more on how to use it ).

首先创建一个 org.threeten.bp.LocalTime(代表一天中某个时间的 class),然后将其格式化为 org.threeten.bp.format.DateTimeFormatter:

// 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 适用于所有可用格式。