使用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
, .Calendar
和java.text.SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。
许多java.timefunction在ThreeTen- Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应Android (请参阅如何使用… )。
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。