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

在我的应用程序中,用户必须从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 AM”或“05:30 PM”。
  • 的时间只是一个经过的时间,例如“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.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表示所有可用格式。

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

    10-09 20:19
    查看更多