&引用;EEE MMM dd HH:mm:ss ZZZ yyyy“;日期格式转换为java.sql.date

&引用;EEE MMM dd HH:mm:ss ZZZ yyyy“;日期格式转换为java.sql.date,java,mysql,sql,date,Java,Mysql,Sql,Date,我正在尝试将EEE MMM dd HH:mm:ss ZZZ yyyyy转换为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 for

我正在尝试将
EEE MMM dd HH:mm:ss ZZZ yyyyy
转换为
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);
我正在使用
java.time
包中的现代类。您注意到,代码不仅更简单,一旦您熟悉了新类的流畅编写风格,代码也更清晰了

如果您想100%现代化,还应该检查您最新的MySQL JDBC驱动程序是否不会直接接受
LocalDate
,而不转换为
java.sql.Date
。应该这样

需要注意的几个细节

  • 如果您需要在您无法控制的计算机上运行代码,请始终为格式化程序提供区域设置,否则无法在非英语区域设置的计算机上解析日期字符串。您可以将
    Locale.ROOT
    用于与语言环境无关的语言环境(它讲英语)
  • 如果可以,请避免使用三个字母的时区缩写。许多是模棱两可的。EET实际上只是半个时区,因为一些使用它的地方现在是EEST(夏季)。最好使用长时区ID,如
    欧洲/布加勒斯特
    ,或者使用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
(基于周的年份)更改为
yyy
(日历年),并将
DD
(一年中的一天)更改为
DD
(月中的一天)。所有这些字母都在中。

我知道这个问题与java.sql.Date有关,但作为附加信息,如果您想将日期转换为LocalDate,下面的代码可能会有所帮助:

private LocalDate getLocalDate(String date){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd hh:mm:ss Z yyyy", Locale.getDefault());
        return LocalDate.parse(date, formatter);
    }
一旦获得LocalDate,就可以将其转换为任何格式。正如问题所期望的那样,yyyy-MM-dd然后只需在LocalDate对象上调用toString()

    LocalDate curr = LocalDate.now();
    System.out.println(curr.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
    System.out.println(curr.toString());
它将显示日期,如“2019-11-20”


希望这对某人有所帮助。

试试
“yyyy-MM-dd”
。非常感谢@Berger
    LocalDate curr = LocalDate.now();
    System.out.println(curr.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
    System.out.println(curr.toString());