使用SimpleDateFormat解析日期不一致

我真的在这个问题上摸不着头脑。 我一直在使用SimpleDateFormat并没有麻烦,但是现在,使用SimpleDateFormat来解析日期(仅有时)只是完全错误。

特别:

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date date = sdf.parse("2009-08-19 12:00:00"); System.out.print(date.toString()); 

打印字符串Wed Aug 19 00:00:00 EDT 2009 。 有没有搞错? – 它甚至不会一直解析到错误的日期!


更新:这很好地修复了它。 难道你不知道,在其他一些地方也被误用了。 得爱调试其他人的代码:)

我想你想要使用HH格式,而不是’hh’,这样你就可以在00-23之间使用小时。 ‘hh’采用12小时增量格式,因此它假设它在AM中。

所以这

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse("2009-08-19 12:00:00"); System.out.print(date.toString()); 

应打印出来

2009年8月19日星期三12:00:00 EDT 2009

小时应指定为HH而不是hh。 请查看http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html中的日期和时间模式部分。

您打印出日期的toString()表示,而不是格式的表示。 您可能还想检查小时表示。 H和h意味着不同的东西。 H表示24小时制(0-23),h表示12小时制(1-12),(k和K分别表示1-24和0-11的时间)

你需要做一些事情:

 //in reality obtain the date from elsewhere, eg new Date() Date date = sdf.parse("2009-08-19 12:00:00"); //this format uses 12 hours for time SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //this format uses 24 hours for time SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.print(sdf.format(date)); System.out.print(sdf2.format(date)); 

TL;博士

 LocalDateTime ldt = LocalDateTime.parse( "2009-08-19 12:00:00".replace( " " , "T" ) ); 

java.time

其他答案是正确的,但使用旧的日期时间类。 那些麻烦的旧类已经被java.time类所取代。

您的输入字符串接近标准ISO 8601格式。 通过用T替换中间的SPACE来调整。 然后可以在不指定格式化模式的情况下解析它。 解析/生成字符串时,java.time类在默认情况下使用ISO 8601。

 String input = "2009-08-19 12:00:00".replace( " " , "T" ); 

输入数据没有关于UTC或时区偏移的信息。 所以我们解析为LocalDateTime

 LocalDateTime ldt = LocalDateTime.parse( input ); 

如果在上下文中您知道预期的偏移量,请应用它。 也许它是用于UTC (零偏移),我们可以使用常量ZoneOffset.UTC

 OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ); 

或许您知道它是针对特定时区的。 时区是偏移量加上一组用于处理夏令时(DST)等exception的规则。

 ZonedDateTime zdt = ldt.atZone( ZoneId.of( "America/Montreal" ) ); 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了旧的麻烦的日期时间类,如java.util.Date.Calendarjava.text.SimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。

许多java.timefunction在ThreeTen- Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应Android (请参阅如何使用… )。

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。