Java 使用SimpleDataFormat进行不一致的日期分析

Java 使用SimpleDataFormat进行不一致的日期分析,java,date,simpledateformat,date-parsing,Java,Date,Simpledateformat,Date Parsing,这件事真让我抓狂。我已经使用了SimpleDateFormats一段时间了,但现在,使用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 0

这件事真让我抓狂。我已经使用了
SimpleDateFormat
s一段时间了,但现在,使用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
。怎么回事它甚至不会一直解析到错误的日期



更新:修复得很好。你不知道吗,在其他一些地方也被误用了。必须喜欢调试别人的代码:)

您打印的是日期的toString()表示,而不是格式的表示。您可能还需要检查小时表示。H和H的意思不同。H表示24小时时钟(0-23),H表示12小时时钟(1-12),(还有k和k分别表示1-24和0-11的时间)

您需要执行以下操作:

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

我想你应该使用
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

应将小时指定为HH而不是HH。查看tl中有关日期和时间模式的部分;博士 java.time 其他答案是正确的,但使用传统日期时间类。那些麻烦的旧类已经被java.time类取代

您的输入字符串接近标准格式。通过用“<代码> T < /代码>替换中间的空间来调整。然后,无需指定格式模式即可对其进行解析。在解析/生成字符串时,java.time类默认使用ISO8601

String input = "2009-08-19 12:00:00".replace( " " , "T" );
输入数据没有关于时间或时区的信息。因此,我们将解析为一个

如果根据上下文您知道预期偏移量,请应用它。也许它是为了(零的偏移量),在这里我们可以使用常数

或者你知道它是为某个特定的时区设计的。时区是一个偏移量加上一组处理异常的规则,如夏令时(DST)

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

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步适应于中(请参阅)


该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。

我会尝试一下,但我认为它不会解决这个问题。在我的应用程序中,我实际上并没有转换回字符串。我正在将日期保存到数据库中,但也有错误。您的格式字符串是否一致?有些DBMS会自动转换值,如果他们能解决问题,有些不会。是否在db级别应用了具有不同格式的列中有问题的值?或者来自一个设置了不同参数的连接?我希望人们在犯错时不要再把事情称为“怪异”和“怪异”/很抱歉我在调试比我年长很多年的人编写的代码,我希望能够信任这些代码。
String input = "2009-08-19 12:00:00".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC );
ZonedDateTime zdt = ldt.atZone( ZoneId.of( "America/Montreal" ) );