Java Joda DateTime在分析字符串时自动更改时区

Java Joda DateTime在分析字符串时自动更改时区,java,jodatime,Java,Jodatime,我有一个“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。如何在不更改时区的情况下解析第一个字

我有一个“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)

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

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

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

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

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

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

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

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

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

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

您可以使用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

您可以使用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

谢谢你的回答。当我尝试将对象序列化为xml时,SimpleDataFormat也有同样的问题?你知道我如何解决这个问题吗?谢谢你的回答。当我尝试将对象序列化为xml时,SimpleDataFormat也有同样的问题?你知道我如何解决这个问题吗?不幸的是,我必须坚持使用JDK7!!不幸的是,我必须坚持使用JDK7!!