首先,您不应该从Postgres数据库中将日期作为String
获取。您应该将其作为表示日期的类型的对象获取。
其次,在2013年,使用Date
和SimpleDateFormat
是常见和合理的,但现在已经过时了,并且新的更好的日期和时间类已经出现并得到普遍使用。在我看来,没有人应该再使用旧的类,我认为它们已经过时了。
要从数据库的ResultSet
中获取LocalDate
对象:
LocalDate da = yourResultSet.getObject(3, LocalDate.class)
(我假设日期在查询的第三列中。)
将其格式化为 dd-MM-yyyy
:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
String strDateTime = da.format(formatter);
System.out.println("==String date is : " + strDateTime);
这将会输出如下结果
==String date is : 21-02-2013
最后,如果您有像问题中那样的字符串,并希望将其重新格式化为所需的格式:
String strDate = "2013-02-21"
LocalDate da = LocalDate.parse(strDate)
System.out.println("==Date is ==" + da);
这将会打印出来
==Date is ==2013-02-21
我正在利用字符串匹配现代日期和时间类所使用的ISO 8601标准日期格式这个事实。因此,在这种情况下,我们不需要显式格式化程序来解析,就像解析其他格式一样。
将其格式化为所需格式与以前完全相同。
旧类带来的问题示例
在我的计算机上,问题代码的输出为:
==Date is ==Tue Aug 06 00:00:00 CET 26
==String date is : 06-08-0026
你明显得到了错误的结果,而且你不知道哪里出了问题。问题在于你使用了用于新字符串“dd-MM-yyyy”的格式化程序来解析你的数据库日期字符串“2013-02-21”。因此,它被解析为公元2013年2月21日。二月份没有2013天?对于默认设置的SimpleDateFormat来说,这不是问题,它只会继续计算进入下一个月和年,并在五年半后的8月6日结束,但仍然非常早。
如果我们尝试使用现代类进行类似的操作:
LocalDate.parse(strDate, formatter)
我们得到了java.time.format.DateTimeParseException: Text '2013-02-21' could not be parsed at index 2
。这是因为格式化程序指定了两位数的日期,所以当解析两个数字后,输入字符串中还有更多数字时,就会报错并报告错误。我认为这种行为更正确、更有帮助。