【问题标题】:How to convert Java String "EEE MMM dd HH:mm:ss zzz yyyy"date type to Java util.Date "yyyy-MM-dd" [duplicate]如何将Java字符串“EEE MMM dd HH:mm:ss zzz yyyy”日期类型转换为Java util.Date“yyyy-MM-dd”[重复]
【发布时间】:2021-04-27 13:36:04
【问题描述】:

我的源日期类型是EEE MMM dd HH:mm:ss zzz yyyy。例如,Sat Dec 12 00:00:00 KST 2020 但我的目标日期类型是 Java 日期类型,格式为 yyyy-MM-dd。所以我制作了将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 日期类型时哪些代码是错误的。

【问题讨论】:

  • 我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APIZonedDateTimeDateTimeFormatter
  • 鉴于您想要该输出,您可以转换为LocalDate。它像2020-12-12 一样打印(总是)。

标签: java date datetime


【解决方案1】:

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

你说:

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

显然,您希望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

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

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

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

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

从哪里获取 java.time 类?

【讨论】:

  • 请告诉我这个字符串值的模式是什么是“2020-12-18 16:04:07-06”?我使用@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss:SSS"。但它抛出异常。
  • @JosephHwang 您的格式模式缺少输入末尾出现的偏移量代码。在 Java 中将该输入解析为 java.time.OffsetDateTime 对象。
  • @JosephHwang OffsetDateTime.parse( "2020-12-18 16:04:07-06".replace( " " , "T" ) )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多