使用Calendar和SimpleDateFormat将时间转换为“HH:mm:ss”会增加1小时

时间:2014-10-27 16:01:34

标签: java android time formatting timezone

请求

我需要转换以秒为单位的时间 - >到" HH:mm:ss" (以及将来的其他格式)。

E.g。 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"

在最后一种情况下,我得到了正确的结果,但我不明白为什么。

问题

  1. 为什么最后一个案例有效?(以前那个没有?')
  2. 我应该如何使用Calendar类在几秒钟内简单地将时间传递给它(没有任何解析)?
  3. 还有另一种解决方案(另一类)吗?除了我自己解析它。

3 个答案:

答案 0 :(得分:1)

不知道你为什么要面对这个问题。但你可以简单地写一些类似的东西。     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 ); 

答案 1 :(得分:0)

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() );

答案 2 :(得分:0)

试试这个:

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);