请求
我需要将以秒->为单位保存的时间转换为"HH:mm:ss"(以及将来的其他格式)。
例如9
秒->"00:00:09"
但是,Calendar
类总是添加+1小时。我想是因为我的时区("Europe/Prague"
)或夏令时。
测试
Date
类的第一个简单用法。然后对不同时区的Calendar
进行了三次实验,分别尝试了setTimeInMillis()
和set()
两种方法。
// Declarations
Calendar cal;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat( format );
String result;
日期类用法:
// Simple Date class usage
Date date = new Date( timeInSecs * 1000 );
result = simpleDateFormat.format( date ); // WRONG result: "01:00:09"
带有"GMT"的日历类:
// Calendar - Timezone GMT
cal = new GregorianCalendar( TimeZone.getTimeZone( "GMT" ) );
cal.setTimeInMillis( timeInSecs * 1000 );
result = simpleDateFormat.format( cal.getTime() ); // WRONG result: "01:00:09"
cal.set( 1970, Calendar.JANUARY, 1, 0, 0, timeInSecs );
result = simpleDateFormat.format( cal.getTime() ); // WRONG result: "01:00:09"
带有"UTC"的日历类:
// Calendar - Timezone UTC
cal = new GregorianCalendar( TimeZone.getTimeZone( "UTC" ) );
cal.setTimeInMillis( timeInSecs * 1000 );
result = simpleDateFormat.format( cal.getTime() ); // WRONG result: "01:00:09"
cal.set( 1970, Calendar.JANUARY, 1, 0, 0, timeInSecs );
result = simpleDateFormat.format( cal.getTime() ); // WRONG result: "01:00:09"
带有"默认"-"欧洲/布拉格"的日历类:
// Calendar - Timezone "default" (it sets "Europe/Prague")
cal = new GregorianCalendar( TimeZone.getDefault() );
cal.setTimeInMillis( timeInSecs * 1000 );
result = simpleDateFormat.format( cal.getTime() ); // WRONG result: "01:00:09"
cal.set( 1970, Calendar.JANUARY, 1, 0, 0, timeInSecs );
result = simpleDateFormat.format( cal.getTime() ); // CORRECT result: "00:00:09"
在最后一种情况下,我得到了正确的结果,但我不明白为什么
问题
- 为什么最后一种情况有效(前一个没有?)
- 我应该如何使用Calendar类来简单地将时间(以秒为单位)传递给它(而不进行任何解析)
- 还有其他解决方案(另一个类)吗?除了我自己解析
不知道您为什么面临这个问题。但你可以简单地写一些类似的东西。int hours = secs / 3600,
remainder = secs % 3600,
minutes = remainder / 60,
seconds = remainder % 60;
string displayHours= (hours < 10 ? "0" : "") + hours,
displayMinutes= (minutes < 10 ? "0" : "") + minutes ,
displaySec = (seconds < 10 ? "0" : "") + seconds ;
System.out.println(disHour +":"+ displayMinutes+":"+displaySec );
TimeZone
(s)与Calendar
和SimpleDateFormat
不一致(,除外)。您可以使用SimpleDateFormat.setTimeZone(TimeZone)
设置相同的时区,它应该可以工作。
// Calendar - Timezone UTC
cal = new GregorianCalendar( TimeZone.getTimeZone( "UTC" ) );
cal.setTimeInMillis( timeInSecs * 1000 );
simpleDateFormat.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); // <-- like so.
result = simpleDateFormat.format( cal.getTime() );
cal.set( 1970, Calendar.JANUARY, 1, 0, 0, timeInSecs );
result = simpleDateFormat.format( cal.getTime() );
试试这个:
int millis = 9 * 1000;
TimeZone tz = TimeZone.getTimeZone("UTC");
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
df.setTimeZone(tz);
String time = df.format(new Date(millis));
Log.i("Duration in seconds: ", time);