java日期转换为00:00:00.000
我有以下格式的日期字符串:java日期转换为00:00:00.000,java,date,datetime,Java,Date,Datetime,我有以下格式的日期字符串: 2011/02/14 00:00:00.000 -0800 我通过以下方式将其转换为java日期对象: this.pubDate = Date.parse("yyyy/MM/dd 00:00:00.000 Z", obj.SourcePublishedDate); 上述结果产生于2011/02/14 00:00:00.000+0000 我对结果有两个问题。在解析0时间的情况下,我使用的格式是“yyyy/MM/dd 00:00:00.000 Z”。有没有更好的方法来
2011/02/14 00:00:00.000 -0800
我通过以下方式将其转换为java日期对象:
this.pubDate = Date.parse("yyyy/MM/dd 00:00:00.000 Z", obj.SourcePublishedDate);
上述结果产生于2011/02/14 00:00:00.000+0000
我对结果有两个问题。在解析0时间的情况下,我使用的格式是“yyyy/MM/dd 00:00:00.000 Z”。有没有更好的方法来做到这一点,维护0?第二个问题是关于时区的,出于某种原因,我要返回+0000而不是-0800。如何解析正确的值?
非常感谢你的时间
// Parser
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS Z");
// Parse date/time with time zone
// OffsetDateTime odtWithTime = OffsetDateTime.parse("2011/02/14 00:00:00.000 -0800", formatter);
OffsetDateTime odtWithTime = OffsetDateTime.parse("2011/02/14 09:30:00.999 -0800", formatter);
// odtWithTime: 2011-02-14T09:30:00.999-08:00
// Remove time from odtWithTime
LocalDateTime ldtWithoutTime = odtWithTime.toLocalDate().atStartOfDay();
OffsetDateTime odtWihtoutTime = OffsetDateTime.of(ldtWithoutTime, odtWithTime.getOffset());
// odtWihtoutTime: 2011-02-14T00:00-08:00
// All time information are reset to Zero
0
指定为文本
试图将2011/02/14 00:00:00.000-0800
之类的字符串解析为日期-时间是一个错误
首先,您不能使用解析模式yyyy/MM/dd 00:00:00.000 Z
,因为零没有解析模式代码。字符0
作为代码没有任何意义
其次,您可能会考虑在时间部分周围添加单引号,例如:yyyy/MM/dd'00:00:00.000'Z
,以告知格式化程序期望时间值为零的字符串文字。虽然您可以告诉格式化程序需要这样的字符串,但问题是字符串文字在语义上被忽略。因此,现在您没有时间值的输入。如果有日期但没有时间,则无法完成对日期时间的解析。将引发异常
解决方案:解析为一天中的时间
解决办法是改变你的心态。意识到你可以在一天中的任何时候接收输入,而不一定是所有的零
请注意:即使您确信您将始终获得一天中第一个时刻的输入,但这并不总是意味着全部为零!在某些时区,一天中的第一个时刻并不总是00:00:00.000
,这是由于时间或其他异常情况造成的
因此,只需告诉格式化程序将零解析为一天中的任何有效时间。注意下面示例代码中解析模式中使用的HH:mm:ss.SSS
java.time
我不知道你在问题中提到的Date
课程是什么
无论如何,您应该使用内置于Java8和更高版本中的框架。看见这些类取代了旧的麻烦的日期时间类,如java.util.date/.Calendar
特别是,您需要类,因为它代表时间线上某个特定时间的某个时刻。如果你有一个完整的时区,而不仅仅是一个偏移,你会使用
为了好玩,示例代码还使用了中时间轴上的一个,一个时刻。从概念上讲,Instant
是OffsetDateTime
和ZonedDateTime
的基础
重要提示:java.time中的解析代码与旧的java.text.simpleDataFormat代码类似,但并不完全相同。一定要仔细阅读文件
转储到控制台
System.out.println ( "input: " + input + " | odt: " + odt + " | instant: " + odt.toInstant () );
输入:2011/02/14 00:00:00.000-0800 | odt:2011-02-14T00:00-08:00 |即时:2011-02-14T08:00:00Z
作为输出生成的字符串默认为标准格式。如果您需要另一种格式,请定义并传递另一种格式。什么是
Date.parse()
?这个问题比乍看起来更有趣。一种情况可能是,他们希望日期时间值始终代表一天中的第一个时刻。因此,他们天真地假设一天中的时间总是全零。考虑到这个假设,您可能会直觉地想到硬编码一天中的全零时间。硬编码零不起作用,原因如下所述。更重要的是,我说“天真”,因为一天中的第一刻并不总是00:00:00.000
。总之,很有趣。谢谢你,所以似乎没有办法解析0时间。你是说解析时忽略时间?答案是肯定的。看我更新的答案!
System.out.println ( "input: " + input + " | odt: " + odt + " | instant: " + odt.toInstant () );