【问题标题】:Joda DateTime automatically change timezone when parsing stringJoda DateTime 解析字符串时自动更改时区
【发布时间】:2017-05-20 12:46:18
【问题描述】:

我有一个“iso8601”格式的日期字符串,当我使用 Joda“DateTime”解析它时,日期的时区会自动更改。

  DateTime dateTime = new DateTime( "2017-05-22T08:10:00.000+0300" ) ;
  System.out.println(dateTime);

它的输出是:

2017-05-22T09:40:00.000+04:30

如您所见,第一个字符串的时区为 +3:00,解析后的时区为 +04:30。如何在不更改时区的情况下解析第一个字符串? (所以即使解析后时区仍然是+03:00)

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    此构造函数使用用户的默认时区。您需要使用DateTime(Object object, DateTimeZone zone) 构造函数手动设置时区。

    或者,使用withOffsetParsed() 解析此字符串,如下所示:

        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'hh:mm:ss.SSSZ");
        DateTime dateTime = formatter.withOffsetParsed().parseDateTime("2017-05-22T08:10:00.000+0300");
    

    【讨论】:

    • 感谢您的有用回答。当我尝试将对象序列化为 xml 时,SimpleDateFormat 有同样的问题?你知道我该如何解决这个问题吗?
    【解决方案2】:

    您必须手动设置时区,如下所示:

    String str =  "2017-05-22T08:10:00.000+0300" ;
    DateTime dateTime = new DateTime() ;
    
    System.out.println(dateTime);
    String tzName = str.substring(text.length() - 5);
    DateTimeZone tz = DateTimeZoneDateTimeZone forID(str.substring(3) + ":" + str.substring(text.length() - 2))
    System.out.println(dateTime.withZone(tz));
    

    【讨论】:

      【解决方案3】:

      您可以使用 JDK 8 日期时间 API 的内置功能轻松解决此问题。以下代码打印 2017-05-22T08:10+03:00。

      DateTimeFormatter df = DateTimeFormatter.ISO_OFFSET_DATE_TIME ;
      OffsetDateTime date1 = OffsetDateTime.parse("2017-05-22T08:10:00.000+03:00", df);
      System.out.println(date1); //prints 2017-05-22T08:10+03:00
      

      【讨论】:

      • 不幸的是我必须坚持使用JDK7!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 2015-04-02
      相关资源
      最近更新 更多