![](/img/trans.png)
[英]Date formats difference between yyyy-MM-dd'T'HH:mm:ss and yyyy-MM-dd'T'HH:mm:ssXXX
[英]Date conversion from yyyy-MM-dd HH:mm:ss to ISO date yyyy-MM-dd'T'HH:mm:ssXXX format issue
我正在尝试将日期格式从yyyy-MM-dd HH:mm:ss转换为ISO日期格式yyyy-MM-dd'T'HH:mm:ss + 5:30,并通过以下代码对其进行了测试,在Eclipse上运行时工作正常,并导致通过jar部署到服务器时出现问题。
问题是日期(输入:2016-01-08 10:22:03)转换为2016-01-08T10:22:03Z而不是2016-01-08T10:22:03 + 5:30。
注意:我正在使用Java 8。
以下是用于转换日期的代码,
SimpleDateFormat outputDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
SimpleDateFormat inputDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String FinalDate = outputDate.format(inputDate.parse(pickupDate));
System.out.println(finalDate);
其他奇怪的经验是,在某些计算机上该问题无法重现,而在某些计算机上存在该问题。 是某种依赖于机器还是JVM的东西? 请帮忙。
先感谢您。
如SimpleDateFormat的文档所示:
对于格式化,如果距GMT的偏移值为0,则生成“ Z”。 如果图案字母的数量为1,则忽略一小时的任何分数。 例如,如果模式为“ X”且时区为“ GMT + 05:30”,则会生成“ +05”。
因此,我的猜测可能是检查服务器的时区。 由于它认为输入日期的时区为GMT 0。
如果使用Java 8或更高版本,则应使用java.time类,而不要使用那些臭名昭著的日期时间类java.util.Date/.Calendar。
您的输入字符串接近标准ISO 8601格式。 解析和生成日期时间值的文本表示时,默认情况下,java.time类使用这些标准格式。 无需为此类标准输入定义编码的解析模式。
要完全符合ISO 8601,请将中间的SPACE替换为T
String inputStandardized = "2016-01-08 10:22:03".replace( " " , "T" );
该字符串没有自UTC偏移量或时区,因此我们首先创建一个LocalDateTime
。
LocalDateTime localDateTime = LocalDateTime.parse( inputStandardized );
这些对象是日期时间的模糊概念,但实际上不在时间轴上。 要在时间线上定义实际时刻,我们必须应用时区。
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = localDateTime.atZone( zoneId );
请注意,特定的日期和时间在指定的时区可能无效; java.time会根据需要进行调整。 请务必阅读文档以了解调整行为。
默认情况下, ZonedDateTime
上的toString
方法以ZonedDateTime
的格式生成一个String,除了扩展为将时区的名称附加在方括号中。
String output = zdt.toString();
2016-01-08T10:22:03 + 05:30 [亚洲/加尔各答]
这种扩展包括时区名称是很有意义的。 时区不仅是与UTC的偏移量,还包括处理异常的当前和历史规则,例如夏令时(DST)。
如果您确实不希望添加该时区名称,则可以按照我的建议使用可以在java.time中定义为常量的备用格式设置模式ISO_OFFSET_DATE_TIME
。
DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME ;
String output = zdt.format( formatter );
2016-01-08T10:22:03 + 05:30
顺便说一句,您可以通过在与UTC的偏移量中始终添加前导填充零来避免问题。 因此,请使用+05:30
而不是问题中所示的+5:30
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.