繁体   English   中英

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

[英]“EEE MMM dd HH:mm:ss ZZZ yyyy” date format to 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 (月份中的某天)。 所有这些字母都在文档中

我知道这个问题与 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”的日期。

希望这对某人有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM