![](/img/trans.png)
[英]Change date from MM/dd to yyyy-MM-dd'T'HH:mm:ss.SSZ in Java
[英]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 8及更高版本中。 这些类取代了麻烦的旧日期时间类,例如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。 Joda-Time小组还建议迁移到java.time。
要了解更多信息,请参见Oracle教程 。 并在Stack Overflow中搜索许多示例和说明。
多的java.time功能后移植到Java 6和7在ThreeTen-反向移植并且还适于在到Android ThreeTenABP 。
您的输入字符串符合ISO 8601标准。 这些标准格式默认在java.time类中使用。 因此,无需指定格式化模式。
您的输入值有一个UTC偏移量,比UTC落后8小时。
OffsetDateTime
类表示此类值。
OffsetDateTime odt = OffsetDateTime.parse( "2016-01-01T10:30:00-0800" );
时区是从UTC偏移的时间, 再加上一组用于处理异常的规则,例如夏令时(DST)。 如果您确定时区将用作此值的上下文,请应用它以获取ZonedDateTime
。
通过正确的时区名称以continent/region
格式指定时区( ZoneId
)。 切勿使用EST
或IST
等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.