如何將Java字符串“EEE-MMM-dd HH:mm:ss zzz-yyyy”日期類型轉(zhuǎn)換為Javautil.Date“yyy-mm-dd”

我的源日期類型是EEE MMM dd HH:mm:ss zzz yyyy。例如,Sat Dec 12 00:00:00 KST 2020,但我的目標(biāo)日期類型是格式為yyyy-MM-dd的Java日期類型。因此,我創(chuàng)建了一個(gè)方法,將Java字符串類型EEE MMM dd HH:mm:ss zzz yyyy轉(zhuǎn)換為Java util對(duì)象。

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

但是返回值的類型是錯(cuò)誤的。方法的返回值似乎沒(méi)有受到影響。

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

上面的行再次打印Sat Dec 12 00:00:00 KST 2020。我不知道哪些代碼在轉(zhuǎn)換Java日期類型時(shí)出錯(cuò)。任何建議都將不勝感激。致以最誠(chéng)摯的問(wèn)候

? 最佳回答:

tl;dr

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

避免遺留的date-time類

您正在使用可怕的date-time類,這些類在幾年前被現(xiàn)代的java.time類所取代。千萬(wàn)不要使用DateCalendarSimpleDateFormat

You said:

我的目標(biāo)日期類型是Java日期類型,格式為yyyy-MM-dd。

顯然,你希望Date能有個(gè)約會(huì)。它沒(méi)有。java.util.Date類表示一個(gè)時(shí)刻,一個(gè)帶有time-of-day的日期,如UTC所示。java.sql.Date類假裝只保存一個(gè)日期,但實(shí)際上它也包含一個(gè)帶有time-of-day的日期,如UTC所示。

java.util.Date類的許多問(wèn)題之一是它的toString方法的行為。該方法在生成文本時(shí)動(dòng)態(tài)應(yīng)用JVM的當(dāng)前默認(rèn)時(shí)區(qū)。這個(gè)anti-feature可能會(huì)導(dǎo)致你的困惑。

LocalDate

相反,您應(yīng)該使用java.time.LocalDate來(lái)表示一個(gè)date-only值,不帶time-of-day,也不帶時(shí)區(qū)或offset-from-UTC。

ZonedDateTime

首先使用DateTimeFormatter類來(lái)解析整個(gè)輸入字符串。這就產(chǎn)生了一個(gè)ZonedDateTime對(duì)象,表示一個(gè)特定地區(qū)的人們通過(guò)wall-clock時(shí)間看到的時(shí)刻。

Example code

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對(duì)象中,提取一個(gè)LocalDate

LocalDate localDate = zdt.toLocalDate() ;

看到這段代碼在IdeOne.com公司.

zdt.toString(): 2020-12-12T00:00+09:00[Asia/Seoul]

ld.toString(): 2020-12-12


About java.time

java.time框架內(nèi)置于Java8和更高版本中。這些類取代了麻煩的舊遺留date-time類,如java.util.DateCalendar、&SimpleDateFormat

要了解更多信息,請(qǐng)參閱Oracle教程。和搜索堆棧溢出的許多例子和解釋。規(guī)格為JSR 310。

Joda-Time項(xiàng)目現(xiàn)在處于維護(hù)模式,建議遷移到j(luò)ava.time類。

您可以直接與數(shù)據(jù)庫(kù)交換java.time對(duì)象。使用符合JDBC 4.2或更高版本的JDBC驅(qū)動(dòng)程序。不需要字符串,也不需要java.sql.*類。hibernate5&jpa2.2支持java.time。

從哪里獲得java.time類?

  • JavaSE8、JavaSE9、JavaSE10、JavaSE11及更高版本—標(biāo)準(zhǔn)JavaAPI的一部分,帶有捆綁實(shí)現(xiàn)。Java9帶來(lái)了一些小的特性和修復(fù)。
  • JavaSE6和JavaSE7大多數(shù)java.time功能是back-ported到ThreeTen-Backport中的Java6和Java7。
  • Android(26+)的更高版本捆綁實(shí)現(xiàn)了java.time類。對(duì)于早期的Android(<26),一個(gè)稱為API desugaring的過(guò)程帶來(lái)了最初沒(méi)有內(nèi)置到Android中的java.time功能的子集。如果desugaring不能提供您所需要的,那么ThreeTenABP項(xiàng)目將ThreeTen-Backport(如上所述)改編為Android。了解如何使用ThreeTenABP…。
主站蜘蛛池模板: 冲田杏梨AV一区二区三区| 精品一区二区三区中文字幕 | 日韩人妻不卡一区二区三区| 无码人妻精品一区二区三区9厂| 亚洲av一综合av一区| 国产一区二区三区免费视频| 国产一区二区三区韩国女主播| 亚洲一区二区三区在线观看精品中文 | 日本一区二区三区精品国产| 精品福利一区二区三区免费视频| 国产主播一区二区| 日韩精品无码视频一区二区蜜桃| 免费国产在线精品一区| 精品一区二区三区电影| 国产高清视频一区二区| 日本高清天码一区在线播放| 久久久久久人妻一区二区三区| 99久久精品日本一区二区免费| 一区二区三区亚洲| 91成人爽a毛片一区二区| 一区二区三区日本视频| 在线免费视频一区二区| 久久精品免费一区二区喷潮| 久久久无码精品人妻一区| 亚洲AV无码一区二区三区久久精品 | 国产精品av一区二区三区不卡蜜| 久久中文字幕无码一区二区 | 亚洲Aⅴ无码一区二区二三区软件| 免费无码一区二区| 国产精品福利区一区二区三区四区 | 日韩高清一区二区三区不卡| 国产日韩精品一区二区三区 | 无码乱码av天堂一区二区| 国产乱人伦精品一区二区| 夜精品a一区二区三区| 视频一区在线免费观看| 日韩精品无码一区二区视频| 无码人妻视频一区二区三区| 高清精品一区二区三区一区| 国产中文字幕一区| 国产视频一区二区在线播放|