首先,您不应该从 Postgres 数据库中以 String 的形式获取您的日期。您应该将其作为表示日期的类型的对象来获取。
第二,虽然在 2013 年使用 Date 和 SimpleDateFormat 是司空见惯和合理的,但日子已经过去了,新的更好的日期和时间课程已经问世并被普遍使用。恕我直言,没有人应该再使用旧课程了,我认为它们早已过时。
要从您的数据库中的ResultSet 获取LocalDate 对象:
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
您显然得到了错误的结果,并且您不知道出了什么问题。 错误是您正在使用您打算用于新字符串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。这是因为格式化程序指示的是两位数的日期,所以当解析两位数后输入字符串中有更多位时,这是一个错误,并因此报告。我认为这种行为更正确、更有帮助。