繁体   English   中英

日期从yyyy-MM-dd HH:mm:ss转换为ISO日期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.time

如果使用Java 8或更高版本,则应使用java.time类,而不要使用那些臭名昭著的日期时间类java.util.Date/.Calendar。

ISO 8601

您的输入字符串接近标准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.

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