【问题标题】:Parsing Java String into GMT Date将 Java 字符串解析为 GMT 日期
【发布时间】:2012-10-21 10:14:51
【问题描述】:

我正在尝试使用 GMT 解析表示日期的字符串,但它会在我的 PC(太平洋)上的时区打印出来。当我运行以下命令时,我得到以下输出。关于如何让解析解析并返回 GMT 日期的任何想法?如果您看下面,我正在使用 format.setTimeZone(TimeZone.getTimeZone("GMT"));但它没有产生预期的结果。

以下代码的输出:

2012 年 10 月 29 日星期一 05:57:00 PDT

 package javaapplication1;

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.TimeZone;


    public class JavaApplication1 {

        public static void main(String[] args) throws ParseException {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
            format.setTimeZone(TimeZone.getTimeZone("GMT"));
            System.out.println(format.parse("2012-10-29T12:57:00-0000"));
        }
    }

【问题讨论】:

  • -0000 不一定表示 GMT。目前尚不完全清楚它表示什么或是否允许(根据the ISO 8601 standard)。这可能意味着与 UTC 的未定义偏移量。 GMT 将由 Z 或带有加号的 +0000 表示。
  • 对于这个问题的新读者,我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APIOffsetDateTimeDateTimeFormatter

标签: java


【解决方案1】:

您在格式化程序中使用format.setTimeZone(TimeZone.getTimeZone("GMT"));,它用于将字符串格式化为日期,即

      Date date = format.parse("2012-10-29T12:57:00-0000");

被解析为 2012-10-29T12:57:00-0000GMT 值,但您正在打印 date,它使用本地时区进行打印,因此您注意到了差异。

如果您想将日期打印回GMT,请使用:

    String formattedDate = format.format(date);

并打印formattedDate这将是GMT

    System.out.println(formattedDate);

【讨论】:

    【解决方案2】:
    System.out.println(format.parse("2012-10-29T12:57:00-0000"));
    

    将日期解析为 GMT 并返回一个 Date 对象。然后将其打印出来(使用默认的 toString() 方法)。这仅使用您计算机的设置。所以你应该使用:

    Date parsedDate=format.parse("2012-10-29T12:57:00-0000");
    System.out.println(format.format(parsedDate));
    

    【讨论】:

      【解决方案3】:

      完整的工作示例

      import java.text.SimpleDateFormat;
      import java.util.Date;
      import java.util.Locale;
      import java.util.TimeZone;
      
      public class Main
      {
          public static void main(String[] args)
          {
              final SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss z", Locale.ENGLISH);
              sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
              System.out.println(sdf.format(new Date())); 
              // ^^^ note printing the results of sdf.format() 
              //     not a raw `Date`
          }
      }
      

      结果:31-10-2012 08:32:01 UTC 注意我实际打印的内容!

      【讨论】:

        【解决方案4】:

        试试这个,

        public static String converterGMTToLocal(String datahora_gmt)
        {
            try {
                SimpleDateFormat fmt = new SimpleDateFormat("YYYY-MM-dd HH:mm");
                Calendar cal = Calendar.getInstance();
                cal.setTime(fmt.parse(datahora_gmt));
                cal.add(Calendar.HOUR, -3);
        
                return fmt.format(cal.getTime());
        
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return e.getMessage();
            }
        }
        

        更改项目的值...进行适当的更改

        【讨论】:

          【解决方案5】:

          java.time

          我建议您使用现代 Java 日期和时间 API java.time 进行日期和时间工作。我更喜欢使用以下格式化程序进行解析。

          private static final DateTimeFormatter PARSER = new DateTimeFormatterBuilder()
                  .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                  .appendPattern("xx")
                  .toFormatter(Locale.ROOT);
          

          解析为OffsetDateTime,以保留字符串的偏移量 (-0000)。

              String gmtString = "2012-10-29T12:57:00-0000";
              OffsetDateTime gmtDateTime = OffsetDateTime.parse(gmtString, PARSER);
              System.out.println(gmtDateTime);
          

          输出是:

          2012-10-29T12:57Z

          输出中尾随的Z 表示UTC 或从UTC 偏移0,就我们的目的而言,我们可以将其视为等同于GMT。如果我们愿意,我们还可以在打印前使用相同(或不同)的格式化程序重新格式化:

              System.out.println(gmtDateTime.format(PARSER));
          

          2012-10-29T12:57:00+0000

          在这种情况下,您可能希望将格式化程序命名为 PARSER 以外的其他名称。

          偏移量 -0000 不合法

          我想知道您从哪里得到该字符串,因为它遵循标准 ISO 8601 格式,但 ISO 8601 不允许 -0000 作为偏移量。偏移量零必须以Z+00:00+0000+00 给出。幸运的是,Java 在这一点上是宽容的,它接受 -0000 等同于 +0000

          链接

          【讨论】:

            猜你喜欢
            • 2013-11-21
            • 1970-01-01
            • 2013-06-05
            • 1970-01-01
            • 1970-01-01
            • 2016-11-06
            • 2012-07-11
            • 2012-10-06
            • 1970-01-01
            相关资源
            最近更新 更多