【问题标题】:Time Difference with UTC java与UTC java的时差
【发布时间】:2014-02-14 11:08:08
【问题描述】:

我想将日期转换为长。但是在 pc 上计算的时间不正确。在 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

【问题讨论】:

    标签: java android date time


    【解决方案1】:

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

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

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

    要解决这个问题,一种选择是将您自己的时区显式设置为 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
    

    如果您想准确解释 TimeZone 相关结果,另一种选择是使用 Calendar 类(如果不是 jodatime)。

    【讨论】:

    • 请注意,更改默认时区是有风险的。影响整个JVM,在那个JVM中运行的所有软件都会得到不同的时区。我不会推荐这种方法。
    【解决方案2】:

    你的问题不清楚。

    使用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
    

    【讨论】:

      【解决方案3】:

      如果尝试调用方法:

      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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-16
        • 2017-01-19
        • 2013-11-27
        • 2016-05-21
        • 2016-08-24
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        相关资源
        最近更新 更多