【问题标题】:Java, How to change GMT time to local time?Java,如何将格林威治标准时间更改为当地时间?
【发布时间】:2012-05-31 19:00:31
【问题描述】:

服务器向我发送这样的时间:

2012-06-08 17:00:00 +0100

我需要根据当地时间将其更改为HH:MM。比如这个时间是日本、印度、美国等的时间。

我该怎么做?谢谢

【问题讨论】:

    标签: java time format localtime


    【解决方案1】:

    其他答案正确但已过时。请改用 java.time 类。

    tl;博士

    ZonedDateTime zdt_Kolkata = OffsetDateTime.parse( "2012-06-08 17:00:00 +0100" , DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss Z" ) ).atZone( ZoneId.of( "Asia/Kolkata" ) );
    

    使用 java.time

    定义一个DateTimeFormatter 格式化模式以匹配您的输入字符串。

    String input = "2012-06-08 17:00:00 +0100";
    DateTimeFormatter f = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss Z" );
    

    OffsetDateTime

    将字符串解析为 OffsetDateTime 对象,该对象代表您输入中的 +0100,这意味着“比 UTC 提前一小时”。

    OffsetDateTime odt = OffsetDateTime.parse( input , f ); 
    

    ZonedDateTime

    应用ZoneId 为任何所需时区生成ZonedDateTime。指定proper time zone name。切勿使用 3-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

    ZoneId zoneId_Kolkata = ZoneId.of( "Asia/Kolkata" ); // India
    ZonedDateTime zdt_Kolkata = odt.atZone( zoneId_Kolkata );
    

    ……还有另一个……

    ZoneId zoneId_Montréal = ZoneId.of( "Asia/Montreal" ); // Québec Canada
    ZonedDateTime zdt_Montréal = odt.atZone( zoneId_Montréal );
    

    Instant

    对于 UTC,提取一个 Instant 对象。 Instant 类代表UTC 中时间轴上的一个时刻,分辨率为nanoseconds

    Instant instant = zdt_Montréal.toInstant();
    

    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date.Calendarjava.text.SimpleDateFormat

    Joda-Time 项目现在位于maintenance mode,建议迁移到 java.time。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。

    大部分 java.time 功能在ThreeTen-Backport 中向后移植到Java 6 和7,并进一步适应ThreeTenABP 中的Android

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。

    【讨论】:

      【解决方案2】:

      选项1:使用java.util.Date/Calendar

      首先您需要将值解析为Date,然后将其重新格式化为格式和时区 你有兴趣:

      SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z",
                                                          Locale.US);
      Date date = inputFormat.parse(inputText);
      
      // Potentially use the default locale. This will use the local time zone already.
      SimpleDateFormat outputFormat = new SimpleDateFormat("HH:mm", Locale.US);
      String outputText = outputFormat.format(date);
      

      选项 2:使用 Joda Time

      Joda Time 是一个更好的 Java 日期/时间库。

      DateTimeFormatter inputFormatter = DateTimeFormat
          .forPattern("yyyy-MM-dd HH:mm:ss Z")
          .withLocale(Locale.US);
      
      DateTime parsed = inputFormatter.parseDateTime(inputText);
      
      DateTimeFormatter outputFormatter = DateTimeFormat
          .forPattern("HH:mm")
          .withLocale(Locale.US)
          .withZone(DateTimeZone.getDefault());
      
      String outputText = outputFormatter.print(parsed);
      

      请注意,您应该仅在真正需要时转换为字符串表示形式/从字符串表示形式转换。否则,请根据您的使用情况使用最合适的类型 - 这是 Joda Time 真正闪耀的地方。

      【讨论】:

        【解决方案3】:

        java.util.Date 是 always 在 UTC 中。是什么让你觉得是当地时间?我怀疑问题是您通过使用本地时区的 Calendar 实例显示它,或者可能使用也使用本地时区的 Date.toString() 。

        如果这不是问题,请发布一些示例代码。

        不过,我还是建议您使用 Joda Time,它提供了更清晰的 API。

        【讨论】:

        • 不恰当的回应,没有帮助。问题没有java.util.Date,大概只有一个字符串。并且没有 java.util.Calendar 显然涉及,因为该接口/类默认情况下不会生成问题中看到的输出。此外,在没有一些解释和示例代码的情况下,仅仅提及库通常不足以回答 Stack Overflow。
        【解决方案4】:

        使用 JodaTime。它比 Java 的日期和时间 API 更好、更安全。有很多方法会返回 LocalTime 对象 (HH:MM)。

        例如 new DateTime(your date time).toLocalTime();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-25
          • 1970-01-01
          • 1970-01-01
          • 2011-10-30
          • 2020-03-31
          • 2011-05-13
          • 2019-11-25
          • 2013-03-10
          相关资源
          最近更新 更多