【问题标题】:Android converting the time in millisecondsAndroid 以毫秒为单位转换时间
【发布时间】:2018-03-07 13:12:03
【问题描述】:

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

在我的应用程序中,用户必须从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;
}

【问题讨论】:

标签: java android time datetime-format milliseconds


【解决方案1】:

您好,使用功能强大的库怎么样?它非常简单实用, 它可以使您免于繁琐的工作 Joda-Time

用法: Gradle 配置:

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

更多信息和文档:

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

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

编码愉快!

【讨论】:

  • 我不需要 libaray,因为它不需要那么多
  • 虽然是一个很棒的 AP​​I(我用过很多并且非常喜欢它),但 Joda-Time 现在处于维护模式并且正在被新的 API 取代,所以我不建议开始一个新项目用它。即使在joda's website 中,它也说:“请注意,Joda-Time 被认为是一个基本上“完成”的项目。没有计划进行重大改进。如果使用 Java SE 8,请迁移到 java.time (JSR-310 )。”。在 Android 中有 ThreeTen Backport,它是 Java 8 新日期/时间 API 的一个很好的反向移植
【解决方案2】:

如果我理解正确,您希望将毫秒转换为 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);
}

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

【讨论】:

    【解决方案3】:

    要了解正在发生的事情:

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

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2014-03-14
      相关资源
      最近更新 更多