我有毫秒值,想要以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
如您所见minutes
和seconds
正在安静地检索,但hours
存在问题。
P.S
1.我提到this post。他们说它运作正常。但不知道为什么不在我的情况下。
2.我确定我希望得到的是小时值,即07
,因为我使用Calendar.HOUR
设置了值,如果我使用cal.get(Calendar.HOUR)
,它也会显示出来。当然是Calendar
类的对象。
替代解决方案
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();
答案 0 :(得分:5)
检查此解决方案。它更优雅
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()
答案 1 :(得分: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),因此可以在那里获得可读时间。
在另一个满足您要求的答案中提供了更好的解决方案。
答案 2 :(得分:1)
使用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