Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UTC java的时差_Java_Android_Date_Time - Fatal编程技术网

UTC java的时差

UTC java的时差,java,android,date,time,Java,Android,Date,Time,我想把日期转换成长的。但在pc上计算的小时数不正确。在Android emulator上计算的时间是正确的(在emulator上计算的时间是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.ou

我想把日期转换成长的。但在pc上计算的小时数不正确。在Android emulator上计算的时间是正确的(在emulator上计算的时间是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

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

虽然Date类旨在反映协调的通用 时间(UTC),根据主机的不同,它可能不准确 Java虚拟机的环境

因此,当您将小时数设置为15时,date将解释您自己的时区并将小时数设置为15。如果UTC
UTC
(您期望的结果)和您当前的时区存在差异,则该差异将反映在您的上述案例中(14对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
另一个选项是使用类(如果不是),以防您想要准确解释
时区相关结果。

如果尝试调用方法:

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'

你的问题不清楚

在图书馆里,这种约会时间的工作要容易得多

依赖默认时区很麻烦。相反,请指定您的时区。在您的情况下,所需的小时“15”似乎是UTC/GMT(无时区偏移)。因此,指定UTC

你说的“将日期转换为长日期”是什么意思?也许您的意思是获取日期(以及Joda Time DateTime)中存储的自历元以来的毫秒数

转储到控制台

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() );
当运行时

现在:2014-02-14T12:43:00.836Z
十五:2014-02-14T15:43:00.836Z
十五毫秒:1392392580836
一天中的15小时:15

请注意,更改默认时区有风险。影响整个JVM,在该JVM中运行的所有软件将获得不同的时区。我不建议采取这种做法。
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() );