我正在尝试将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中。

10-05 20:12
查看更多