我正在尝试将 EEE MMM dd HH:mm:ss ZZZ yyyy
转换为 YYYY-MM-DD
格式,以便我可以将其插入 MySQL 数据库。我没有收到任何错误,但插入到我的数据库中的日期是错误的,并且每行都相同......
String date = Sat Mar 04 09:54:20 EET 2017;
SimpleDateFormat formatnow = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZ yyyy");
SimpleDateFormat formatneeded=new SimpleDateFormat("YYYY-MM-DD");
java.util.Date date1 = (java.util.Date)formatnow.parse(date);
String date2 = formatneeded.format(date1);
java.util.Date date3= (java.util.Date)formatneeded.parse(date2);
java.sql.Date sqlDate = new java.sql.Date( date3.getTime() );
pst.setDate(1, sqlDate);
最佳答案
LocalDate date4 = ZonedDateTime
.parse(date, DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH))
.toLocalDate();
java.sql.Date date5 = java.sql.Date.valueOf(date4);
我正在使用 java.time
中的现代类包裹。你会发现代码不仅更简单,一旦你熟悉了新类的流畅写作风格,它也更清晰。
如果您想 100% 现代,您还应该检查您最新的 MySQL JDBC 驱动程序是否不接受 LocalDate
直接不转换为java.sql.Date
。应该如此。
一些需要注意的细节
- 如果您需要代码在您无法控制的计算机上运行,请始终为格式化程序提供区域设置,否则无法在非英语区域设置的计算机上解析您的日期字符串。您可以使用
Locale.ROOT
对于中立的语言环境(它说英语)。 - 如果可以的话,请避免使用三个字母的时区缩写。很多都是模棱两可的。 EET 实际上只是半个时区,因为一些使用 EET 的地方现在处于 EEST(夏令时)。最好使用长时区 ID,如
Europe/Bucharest
或与 UTC 的偏移量,如+02:00
.
无论您是否使用DateTimeFormatter
,这些点都有效。或SimpleDateFormat
.
如果您不能或不想继续使用推荐的较新类,则对代码的修复是:
SimpleDateFormat formatnow
= new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
SimpleDateFormat formatneeded = new SimpleDateFormat("yyyy-MM-dd");
我使用小写zzz
因为这被记录为匹配三个字母的时区名称,所以我知道大写 ZZZ
也有效。我已经添加了语言环境。也许最重要的是,我改变了所需的格式 YYYY
(基于周的年份)至 yyyy
(日历年)和 DD
(一年中的某一天)至 dd
(一个月中的某一天)。所有这些字母都在 the documentation 中.
关于java - "EEE MMM dd HH:mm:ss ZZZ yyyy"日期格式转换为java.sql.Date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43933597/