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

“如何转换Java字符串”;EEE MMM dd HH:mm:ss zzz yyyy“;日期类型为Java util.date“;yyyy-MM-dd“;,java,date,datetime,Java,Date,Datetime,我的源日期类型是EEE MMM dd HH:mm:ss zzz yyyy。例如,Sat Dec 12 00:00:00 KST 2020但我的目标日期类型是Java日期类型,格式为yyy-MM-dd。因此,我提出了将Java字符串类型EEE MMM dd HH:mm:ss zzz yyyy转换为Java util对象的方法 private static Date getDate(String beforeDate) throws Exception{ Simpl

我的源日期类型是
EEE MMM dd HH:mm:ss zzz yyyy
。例如,
Sat Dec 12 00:00:00 KST 2020
但我的目标日期类型是Java日期类型,格式为
yyy-MM-dd
。因此,我提出了将Java字符串类型
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(格式)
line打印我期望的正确值

2020-12-12
2020-12-12
2013-01-01
但是返回值的类型是错误的。方法的返回值似乎不受影响

System.out.println(getDate("Sat Dec 12 00:00:00 KST 2020")); 
上述行再次打印2020年12月12日星期六00:00:00。我不知道转换Java日期类型时哪些代码是错误的。

tl;博士
ZoneDateTime
.parse(
“2020年12月12日星期六00:00:00”,
日期时间格式化程序
模式名称(“EEE MMM dd HH:mm:ss zzz UUU”)
.withLocale(Locale.US)
)
.toLocalDate()
.toString()
2020-12-12

避免遗留日期时间类 您正在使用可怕的日期时间类,这些类在几年前被现代java.time类所取代。切勿使用日期、日历或简化格式

你说:

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

显然,您希望
Date
保留一个日期。事实并非如此。
java.util.Date
类表示一个时刻,一个日期和UTC中的时间一致。
java.sql.Date
类假装只保存一个日期,但实际上它也包含一个日期和UTC中的时间

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

LocalDate
相反,您应该使用
java.time.LocalDate
来表示一个只包含日期的值,该值没有一天中的时间,也没有时区或UTC的偏移量

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

示例代码
String input=“Sat Dec 12 00:00:00 KST 2020”;
DateTimeFormatter f=带有Locale(Locale.US)的模式的DateTimeFormatter.(“EEE-MMM-dd-HH:mm:ss-zzz-uuuu”);
ZonedDateTime zdt=ZonedDateTime.parse(输入,f);
从该
ZonedDateTime
对象中,提取一个
LocalDate

LocalDate localDate = zdt.toLocalDate() ;
看这个

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

ld.toString():2020-12-12


关于java.time

该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类。Hibernate5和JPA2.2支持java.time

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • 带来了一些小功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • Android(26+)的更高版本捆绑了java.time类的实现

    • 对于早期的Android(请告诉我这个字符串值的模式是“2020-12-18 16:04:07-06”?我使用@JsonFormat(pattern=“yyyy-MM-dd HH:MM:ss:SSS”。但它引发异常。@Josephwang您的格式模式缺少显示在输入末尾的UTC偏移量的代码。将该输入作为java中的
      java.time.OffsetDateTime
      对象进行分析。@Josephwang
      OffsetDateTime.Parse(“2020-12-18 16:04:07-06”。替换(“,“T”))
      我建议您不要使用
      SimpleDateFormat
      Date
      。这些类的设计很差,而且很早就过时了,前者特别麻烦。相反,请使用
      ZonedDateTime
      DateTimeFormatter
      ,两者都来自。如果需要该输出,可以转换为
      LocalDatee> 。它的打印方式类似于
      2020-12-12
      (始终)。