繁体   English   中英

java中的SimpleDateFormat(“ yyyy-MM-dd'T'HH:mm:ssZ”)解析给出错误的日期?

[英]SimpleDateFormat(“yyyy-MM-dd'T'HH:mm:ssZ”) parse in java gives wrong date?

我使用了此SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") 。因此,当我通过日期2016-01-01T10:30:00-0800大于或等于10:30:00-0800时间,然后它将解析(日期)响应,这是预期的第二天日期2016-01-02T00:00:00 + 0530。它将日期更改一天。如果我给出2016-01-01T10:20:00- 0800然后给出确切的日期。因此,如果时间应该少于t10:30:00-0800,则获得预期结果,否则第二天为日期。

完整代码:

SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
public Date deserialize(JsonParser jsonparser, DeserializationContext arg1)   {
  String date = jsonparser.getText();
  dt.parse(date);
}

重要的是要了解类java.util.Date的实例不是日历日期,而是时刻。

java.util.Date与字符串表示形式进行转换始终会涉及时区。

您的输入是2016-01-01T10:30:00-0800 ,指示区域偏移为-8小时(这是美国洛杉矶的时区)。 该时间点对应于偏移量为0小时(例如伦敦,GB)的区域中的2016-01-01T18:30:00+0000或对应于您所在时区的2016-01-02T00:00:00+0530

如果您想存储洛杉矶会议开始的时间并在不同时区显示该时间,那就很好。

如果要表示没有固有时间信息的日期(例如生日),则最好使用java.time.LocalDate (如果使用的是Java 8)或org.joda.time.LocalDate (如果没有Java 8的选项) 。

java.time

您使用的是过时的过时的日期时间类,事实证明它们的设计不正确,令人困惑且麻烦。 使用java.time代替。

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendarjava.text.SimpleDateFormat Joda-Time小组还建议迁移到java.time。

要了解更多信息,请参见Oracle教程 并在Stack Overflow中搜索许多示例和说明。

多的java.time功能后移植到Java 6和7在ThreeTen-反向移植并且还适于在到Android ThreeTenABP

ISO 8601

您的输入字符串符合ISO 8601标准。 这些标准格式默认在java.time类中使用。 因此,无需指定格式化模式。

偏移量

您的输入值有一个UTC偏移量,比UTC落后8小时。

OffsetDateTime类表示此类值。

OffsetDateTime odt = OffsetDateTime.parse( "2016-01-01T10:30:00-0800" );

时区

时区是从UTC偏移的时间, 再加上一组用于处理异常的规则,例如夏令时(DST)。 如果您确定时区将用作此值的上下文,请应用它以获取ZonedDateTime

通过正确的时区名称continent/region格式指定时区( ZoneId )。 切勿使用ESTIST等3-4个字母的缩写,因为它们不是真实的时区,不是标准化的,甚至也不是唯一的(!)。

ZoneId zoneId = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime zdt = odt.atZone( zoneId );

变更时区

如果要通过印度当地时间查看此值,则可以应用其他时区来创建新的ZonedDateTime java.time类使用不可变对象模式。 因此请注意,java.time类不是更改(“突变”)现有对象上的时区设置,而是根据原始对象的成员创建一个带有其某些成员的新对象。

ZonedDateTime zdt_Kolkata = zdt.withZoneSameInstant( ZoneId.of( "Asia/Kolkata" ) ) ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM