Android以毫秒为单位转换时间

时间:2017-09-26 10:43:51

标签: 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;
}

3 个答案:

答案 0 :(得分:1)

了解发生了什么:

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

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

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

虽然这两个概念可能会使用相同的单词("小时","分钟","秒"等),但他们会这样做不一样的。

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,则格式为{{1} }})。

Java新日期/时间API

旧类(HH:mmDateCalendar)有lots of problemsdesign issues,并且它们被新API取代

在Android中,您可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。为了使其有效,您还需要ThreeTenABP(更多关于如何使用它here)。

首先,您创建一个SimpleDateFormat(一个代表当天时间的类),然后使用org.threeten.bp.LocalTime格式化它:

org.threeten.bp.format.DateTimeFormatter

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

答案 1 :(得分:0)

您好,如何使用功能强大的库?它非常简单实用, 它可以让你远离多条线路 Joda-Time

用法: Gradle配置:

PaymentType

了解更多信息和文档:

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

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

快乐的编码!

答案 2 :(得分:0)

如果我理解你的话,你想把毫米转换成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);
}

只需尝试并将格式语法更改为您喜欢的格式