2

我有毫秒值,并希望以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.

附言

1.我提到了这篇文章。他们说它很好用。但不知道为什么不是我的情况。

2.我确定我想得到什么作为小时值,即07我已经设置了使用的值Calendar.HOUR,如果我使用cal.get(Calendar.HOUR).cal,它也会显示出来当然是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();
4

3 回答 3

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()
于 2014-01-31T15:00:28.637 回答
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),因此它在那里获得了一个可读的时间。

另一个答案中提供了更好的解决方案,可满足您的要求。

于 2014-01-31T15:48:26.470 回答
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 );

转储到控制台...</p>

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

运行时……</p>

millis: 1391391422174
dateTime: 2014-02-03T07:07:02.174+05:30
dateTimeEarlier: 2014-02-03T07:02:02.174+05:30
output: 07:02:02
于 2014-02-03T04:37:43.017 回答