“EEE MMM dd HH:mm:ss ZZZ yyyy”日期格式为java.sql.Date

我正在尝试将EEE MMM dd HH:mm:ss ZZZ yyyyYYYY-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实际上只是半个时区,因为它现在使用的地方是EEST(夏令时)。 最好使用像Europe/Bucharest这样的长时区ID,或者像+02:00那样使用UTC的偏移量。

无论您使用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 (月中的某天)。 所有这些信件都在文件中 。