使用日历和简单日期格式将时间转换为"HH:mm:ss"将增加 1 小时



请求

我需要将以秒->为单位保存的时间转换为"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"

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

问题

  1. 为什么最后一种情况有效(前一个没有?)
  2. 我应该如何使用Calendar类来简单地将时间(以秒为单位)传递给它(而不进行任何解析)
  3. 还有其他解决方案(另一个类)吗?除了我自己解析

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

试试这个:

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

相关内容

  • 没有找到相关文章

最新更新