【问题标题】:"EEE MMM dd HH:mm:ss ZZZ yyyy" date format to java.sql.Date“EEE MMM dd HH:mm:ss ZZZ yyyy”日期格式为 java.sql.Date
【发布时间】:2017-10-11 12:42:33
【问题描述】:

我正在尝试将 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);

【问题讨论】:

  • 试试"yyyy-MM-dd"
  • 非常感谢@Berger

标签: java mysql sql date


【解决方案1】:
    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(月中的某天)。所有这些字母都在the documentation

【讨论】:

    【解决方案2】:

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

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多