我的源日期類型是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
避免遺留的date-time類
您正在使用可怕的date-time類,這些類在幾年前被現(xiàn)代的java.time類所取代。千萬(wàn)不要使用
Date
、Calendar
或SimpleDateFormat
。You said:
顯然,你希望
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
從
ZonedDateTime
對(duì)象中,提取一個(gè)LocalDate
。看到這段代碼在IdeOne.com公司.
About java.time
java.time框架內(nèi)置于Java8和更高版本中。這些類取代了麻煩的舊遺留date-time類,如
java.util.Date
、Calendar
、&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類?