请求

我需要将以秒为单位保存的时间->转换为“ 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类来简单地以秒为单位传递时间(不进行任何分析)?
还有另一种解决方案(另一类)吗?除了自行解析外。

最佳答案

TimeZone(s)不同意CalendarSimpleDateFormat(最后一个例子除外)。您可以使用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() );

关于java - 使用Calendar和SimpleDateFormat将时间转换为“HH:mm:ss”会增加1小时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26591706/

10-14 00:50