首先,您不应该String
从 Postgres 数据库中获取日期。您应该将其作为表示日期的类型的对象来获取。
其次,虽然在 2013 年使用Date
和SimpleDateFormat
普遍合理,但日子已经过去,新的更好的日期和时间类已经问世并普遍使用。恕我直言,没有人应该再使用旧课程了,我认为它们早已过时。
要从您的数据库中获取LocalDate
对象:ResultSet
LocalDate da = yourResultSet.getObject(3, LocalDate.class);
(我假设日期在查询的第 3 列中)。
将其格式化为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
您显然得到了错误的结果,并且您不知道出了什么问题。问题是您正在使用您打算用于新字符串的格式化程序解析您的2013-02-21
数据库日期字符串dd-MM-yyyy
. 所以它被解析为公元 2013 年 2 月 21 日。2月不是2013天吗?使用默认设置没有问题SimpleDateFormat
,它只是继续计算接下来的几个月和几年的天数,并在五年半后的 8 月 6 日结束,但仍处于历史的早期阶段。
如果我们尝试对现代类进行类似操作:
LocalDate.parse(strDate, formatter);
——我们得到java.time.format.DateTimeParseException: Text '2013-02-21' could not be parsed at index 2
。这是因为格式化程序指示了两位数的日期,所以当解析两位数后输入字符串中有更多位时,这是一个错误,并因此报告。我认为这种行为更正确,更有帮助。