使用SimpleDateFormat解析日期不一致

时间:2009-08-21 17:37:21

标签: java date simpledateformat date-parsing

我真的在这个问题上摸不着头脑。我一直在使用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。有没有搞错? - 它甚至不会一直解析错误的日期!


更新:修好了它。你不知道吗,在其他一些地方也被误用了。一定要喜欢调试其他人的代码:)。

4 个答案:

答案 0 :(得分:25)

我认为您希望使用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

答案 1 :(得分:3)

小时应指定为HH而不是hh。查看http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html

中有关日期和时间模式的部分

答案 2 :(得分:2)

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

您需要执行以下操作:

//in reality obtain the date from elsewhere, e.g. 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));

答案 3 :(得分:1)

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" );

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

LocalDateTime ldt = LocalDateTime.parse( input );

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

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

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

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

关于java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

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