【问题标题】:Formatting milliseconds to hh:mm:ss format将毫秒格式化为 hh:mm:ss 格式
【发布时间】:2019-03-12 11:32:57
【问题描述】:

我有毫秒值,并希望以hh:mm:ss 格式显示从当前毫秒值减去 5 分钟的时间。

代码

String str = String.format("%02d:%02d:%02d", 
                                TimeUnit.MILLISECONDS.toHours((cal.getTimeInMillis()-300000)),
                                TimeUnit.MILLISECONDS.toMinutes(cal.getTimeInMillis()-300000) - 
                                TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(cal.getTimeInMillis()-300000)),
                                TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis()-300000) - 
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(cal.getTimeInMillis()-300000)));

Toast.makeText(getApplicationContext(), "Alarm Set."+str, Toast.LENGTH_LONG).show()

立即输出

Alarm Set. 386467:25:00

需要输出

Alarm Set. 07:25:00

如您所见,minutesseconds 正在安静地检索,但 hours 存在一些问题。

附言

1.我推荐了this post。他们说效果很好。但不知道为什么我的情况不行。

2.我确定我想得到什么作为小时值,即07,因为我已经使用Calendar.HOUR 设置了值,如果我使用cal.get(Calendar.HOUR),它也会显示出来。当然是@ 的对象987654332@班级。

替代解决方案

 SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
 String str1 = sdf.format(new Date(cal.getTimeInMillis()-300000));
 Toast.makeText(getApplicationContext(), "Alarm Set."+str1, Toast.LENGTH_LONG).show();

【问题讨论】:

  • 使用 SimpleDateFormat,我看到有人建议。然后只需格式化您的时间 - 适当的毫秒数。
  • 我确实使用它并解决了问题。谢谢。但仍然想知道这段代码 sn-p 的问题是什么,因为其他人说这工作正常。
  • 所写的解决方案不起作用。仅以第一个小时的价值为例。如果当前时间是小时后 2 秒,它仍将显示当前小时,因为您没有从小时值中减去任何时间。分钟呢?如果当前分钟数是 2,你减去 5,它会得到什么?正确的方法是以毫秒为单位获取时间,减去 5 分钟,然后输出值。那应该行得通。但即便如此,使用 SimpleDateFormat 更有意义。
  • 第一个小时是什么意思?在这种情况下,我与当前小时和当前分钟无关。我只是在我的应用程序中设置了一个警报,它将在设定时间的 5 分钟之前触发。
  • 啊,不清楚的是您正在寻找相对时间(您的毫秒值已经应该是计时器到期之前的剩余时间)。您引用的另一篇文章是“以毫秒为单位的剩余时间”(例如,timerExpiration - System.currentTimeMillis())。正如我认为其中一个答案所解释的那样,您的价值已经关闭了几个小时,因为您显示的是到期时间,而不是到期前的剩余时间。我认为这解释了混乱。

标签: java android date calendar timeunit


【解决方案1】:

检查此解决方案。更优雅

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
String str = sdf.format(new Date(System.currentTimeMillis()));
Toast.makeText(getApplicationContext(), "Alarm Set."+str, Toast.LENGTH_LONG).show()

【讨论】:

  • 感谢您的建议。它只需稍作修改即可工作,即 HH:mm:sshh:mm:ss。我承认它比另一个更优雅。但我只是想知道那里有什么问题那个sn-p。
【解决方案2】:

它工作正常,你看到如此巨大的偏移的唯一原因是因为它正在计算自 UNIX 纪元以来的总小时数。

当您执行Calendar.getInstance() 时,它会为您提供当前时间点。将其转换为毫秒是自 UNIX 纪元以来的总毫秒数。

您可以查看自纪元以来的总小时数:

//Check for the hours since the UNIX Epoch
System.out.println(System.currentTimeMillis() / 3600000);

输出:

386439

您下面的代码也会产生这个结果,并附加当前时间点的分钟和秒:

Calendar cal = Calendar.getInstance();

String str = String
        .format("%02d:%02d:%02d",
                TimeUnit.MILLISECONDS.toHours((cal.getTimeInMillis() - 300000)),
                TimeUnit.MILLISECONDS.toMinutes(cal.getTimeInMillis() - 300000)
                        - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS
                                .toHours(cal.getTimeInMillis() - 300000)),
                TimeUnit.MILLISECONDS.toSeconds(cal.getTimeInMillis() - 300000)
                        - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS
                                .toMinutes(cal.getTimeInMillis() - 300000)));

System.out.println(str);

输出:

386439:38:20

注意:您的参考示例考虑了一个常量值 millis (3600000),因此它在那里获得了可读时间。

在满足您要求的其他答案中提供了更好的解决方案。

【讨论】:

  • 这正是他们所说的精湛的解释。你是一个宝石。非常感谢你的解释。
  • 谢谢。如果我不烦你,你也可以看看this post
  • @Sash_kp 我想 android 大师可以帮助你:)
  • 感谢您的关注。但我到现在还没有得到任何答案。不知道您能否对此有所了解。
  • 如果你能帮助我,请看this post
【解决方案3】:

使用Joda-Time 库使这项工作变得更加容易。

// Note that milliseconds-since-epoch needs to be a "long" rather than an "int".
long millis = new DateTime().getMillis(); 

// Specify a time zone rather than rely on default.
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" ); // Formerly known as Calcutta India.

// Instantiate a DateTime object from number of milliseconds since Unix epoch.
DateTime dateTime = new DateTime( millis, timeZone );

// Go back 5 minutes.
DateTime dateTimeEarlier = dateTime.minusMinutes( 5 );

// Get a formatter to render a string of the time portion.
DateTimeFormatter formatter = ISODateTimeFormat.hourMinuteSecond();

// Use the formatter to create a string.
String output = formatter.print( dateTimeEarlier );

转储到控制台…

System.out.println( "millis: " + millis );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTimeEarlier: " + dateTimeEarlier );
System.out.println( "output: " + output );

运行时……

millis: 1391391422174
dateTime: 2014-02-03T07:07:02.174+05:30
dateTimeEarlier: 2014-02-03T07:02:02.174+05:30
output: 07:02:02

【讨论】:

    猜你喜欢
    • 2012-02-20
    • 2022-11-28
    • 2011-09-26
    • 2023-03-22
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多