与UTC java的时差

时间:2014-02-14 11:08:08

标签: java android date time

我想要长时间转换日期。但是在电脑上计算的时间不正确。在Android模拟器上是时间正确计算(在模拟器上是UTC时间)。请帮忙

String time = "15:54";

Date date = new Date();
date.setHours(Integer.parseInt(time.substring(0, 2)));

long Hours = (date.getTime() / (1000 * 60 * 60)) % 24;

System.out.print(Hours);                        // 14
System.out.print("\n" + date.getHours());       // 15

3 个答案:

答案 0 :(得分:2)

当您将小时数设置为Date时,java.util.Date对象独立于TimeZone的概念。根据其javadoc here

  

虽然Date类旨在反映协调的通用   时间(UTC),它可能不会完全这样做,具体取决于主机   Java虚拟机的环境。

因此,当您将小时数设置为15时,日期会解释您自己的时区并设置小时数。如果UTC(您期望的结果)和您当前的时区存在差异,那么差异就会反映在您的情况中(14 vs 15)。

要解决此问题,1选项是明确将您自己的时区带到UTC并匹配预期结果:

String time = "15:54";

Date date = new Date();
java.util.TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // ADDED THIS LINE
date.setHours(Integer.parseInt(time.substring(0, 2)));

long hours = (date.getTime() / (60 * 60 * 1000)) % 24;

System.out.print(hours); // NOW THIS GIVES 15
System.out.print("\n" + date.getHours()); // 15

另一种选择是使用Calendar课程(如果不是jodatime),以防您想要准确地解释TimeZone相关结果。

答案 1 :(得分:1)

你的问题不明确。

使用Joda-Time库可以更轻松地完成这种日期工作。

依赖默认时区很麻烦。而是,指定您的时区。听起来在您的情况下,所需的小时“15”是UTC / GMT(没有时区偏移)。因此,请指定UTC。

“长期转换日期”是什么意思?也许你的意思是在Date(以及Joda-Time DateTime)中存储毫秒 - 自 - 纪元。

DateTime now = new DateTime( DateTimeZone.UTC );
DateTime fifteen = now.withHourOfDay( 15 );

转储到控制台...

System.out.println( "now: " + now );
System.out.println( "fifteen: " + fifteen );
System.out.println( "fifteen in millis: " + fifteen.getMillis() );
System.out.println( "fifteen's hour-of-day: " + fifteen.getHourOfDay() );

跑步时......

now: 2014-02-14T12:43:00.836Z
fifteen: 2014-02-14T15:43:00.836Z
fifteen in millis: 1392392580836
fifteen's hour-of-day: 15

答案 2 :(得分:0)

如果尝试调用方法:

private static String   TIME_FORMAT = "HH:mm Z";

public static void TestDate( String time_ ) throws ParseException
{
    SimpleDateFormat    format  = new SimpleDateFormat( TIME_FORMAT );
    Date                date    = format.parse( time_ );
    long                hours   = (date.getTime() / (1000 * 60 * 60)) % 24;

    System.out.println( "The value 'hours' for '" + time_ + "' is '" + Long.toString( hours ) + "'" );

}

以“15:54 UTC”,输出将是:

The value 'hours' for '15:54 UTC' is '15'