如何将 Java 字符串“EEE MMM dd HH:mm:ss zzz yyyy”日期类型转换为 Java util.Date“yyyy-MM-dd”

时间:2021-01-23 05:41:02

标签: java date datetime

我的源日期类型是 EEE MMM dd HH:mm:ss zzz yyyy。例如,Sat Dec 12 00:00:00 KST 2020 但我的目标日期类型是格式为 yyyy-MM-dd 的 Java 日期类型。所以我制作了将Java String类型EEE MMM dd HH:mm:ss zzz yyyy转换为java util对象的方法。

private static Date getDate(String beforeDate) throws Exception{
        
        SimpleDateFormat readFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
        Date rdate = readFormat.parse(beforeDate);
        
        SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 
        String format = writeFormat.format(rdate);
        
        System.out.println(format);
        
        return writeFormat.parse(format);
    }

System.out.println(format) 行打印出我期望的正确值。

2020-12-12
2020-12-12
2013-01-01

但是返回值的类型是错误的。方法的返回值似乎没有受到影响。

System.out.println(getDate("Sat Dec 12 00:00:00 KST 2020")); 

上一行再次打印 Sat Dec 12 00:00:00 KST 2020。我不知道在转换 Java 日期类型时哪些代码是错误的。

1 个答案:

答案 0 :(得分:5)

tl;博士

ZonedDateTime
.parse( 
    "Sat Dec 12 00:00:00 KST 2020" ,
    DateTimeFormatter
    .ofPattern( "EEE MMM dd HH:mm:ss zzz uuuu" )
    .withLocale( Locale.US )
)
.toLocalDate()
.toString() 
<块引用>

2020-12-12

避免遗留的日期时间类

您正在使用多年前被现代 java.time 类取代的糟糕的日期时间类。切勿使用 DateCalendarSimpleDateFormat

你说:

<块引用>

我的目标日期类型是格式为 yyyy-MM-dd 的 Java 日期类型。

显然,您希望 Date 举行约会。它不是。 java.util.Date 类表示一个时刻,即一个日期,如 UTC 中所见。 java.sql.Date 类假装只保存一个日期,但它实际上也包含一个日期,如在 UTC 中看到的那样。

java.util.Date 类的众多问题之一是其 toString 方法的行为。该方法在生成文本时动态应用 JVM 的当前默认时区。此反功能可能会让您感到困惑。

LocalDate

相反,您应该使用 java.time.LocalDate 来表示没有时间和时区或与 UTC 的偏移量的仅日期值。

ZonedDateTime

首先使用 DateTimeFormatter 类解析整个输入字符串。这会生成一个 ZonedDateTime 对象,表示通过特定地区的人们使用的挂钟时间看到的时刻。

示例代码

String input = "Sat Dec 12 00:00:00 KST 2020" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss zzz uuuu" ).withLocale( Locale.US ) ;
ZonedDateTime zdt = ZonedDateTime.parse( input , f ) ;

从那个 ZonedDateTime 对象中,提取一个 LocalDate

LocalDate localDate = zdt.toLocalDate() ;

看到这个code run live at IdeOne.com

<块引用>

zdt.toString(): 2020-12-12T00:00+09:00[亚洲/首尔]

ld.toString(): 2020-12-12


关于java.time

Table of all date-time types in Java, both modern and legacy

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅 Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为 JSR 310

现在位于 Joda-Timemaintenance mode 项目建议迁移到 java.time 类。

您可以直接与您的数据库交换 java.time 对象。使用符合 JDBC driver 或更高版本的 JDBC 4.2。不需要字符串,不需要 java.sql.* 类。 Hibernate 5 和 JPA 2.2 支持 java.time

从哪里获取 java.time 类?