字符串!=日期 - 時間
不要混淆一個日期時間對象與表示其值的String。
您應該儘可能使用對象。生成一個字符串僅用於呈現給用戶。使用字符串與其他軟件交換數據時,請僅使用ISO 8601格式。
java.time
的問題和接受的答案都使用麻煩的舊的遺留日期時間類,現在由java.time類取代。
您的輸入格式不是標準的,而且容易混淆。這是-12:00
結束時區或時間?我會猜測一天的時間。這個猜測意味着輸入缺少任何關於從UTC或時區偏移的指示。所以我們解析爲LocalDateTime
對象。
String input = "5/5/1991-12:00"
DateTimeFormatter f = DateTimeFormatter.ofPattern("M/d/uuuu-HH:mm");
LocalDateTime ldt = LocalDateTime.format(input , f);
ldt.toString():1991-05-05T12:00
甲LocalDateTime
對象故意缺乏任何offset-from-UTC或時區。這意味着它不是而是代表了時間軸上的一個時刻,只是關於可能時刻的一個粗略想法。你必須指定一個時區來賦予其含義。
如果您的建議上下文表明該輸入是爲了在UTC,應用不斷ZoneOffset.UTC
得到一個OffsetDateTime
。
OffsetDateTime odt = ldt.atOffset (ZoneOffset.UTC);
odt.toString():1991-05-05T12:00Z
在標準ISO 8601字符串的結尾的Z
是短期的和Zulu
UTC。
另一方面,如果上下文指示特定時區,請應用ZoneId
以獲得ZonedDateTime
。什麼時區用於您的示例輸入字符串?你是指新西蘭奧克蘭中午,巴黎中午中午或加拿大魁北克蒙特利爾中午?
ZoneId z = ZoneId.of ("America/Montreal");
ZonedDateTime zdt = ldt.atZone (z);
zdt.toString():1991-05-05T12:00-04:00 [美國/蒙特利爾]
關於java.time
的java.time框架內置到Java 8和更高版本。這些課程取代了麻煩的舊日期時間課程,如java.util.Date
,.Calendar
,& java.text.SimpleDateFormat
。
Joda-Time項目現在位於maintenance mode,建議遷移到java.time。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。
大部分的java.time功能後移植到Java 6 和ThreeTenABP還適於Android(見How to use…)。
ThreeTen-Extra項目擴展java.time與其他類。這個項目是未來可能增加java.time的一個試驗場。你可以在這裏找到一些有用的類,如Interval
,YearWeek
,YearQuarter
,等等。
我不明白。如果你有一個'Calendar'實例,你可以直接從它得到'Date'。爲什麼你需要將它轉換爲一個字符串並解析該字符串? –
JodaTime?不,你應該使用JDK 8和java.time包。 – duffymo
我不清楚。我有一個日期遵循MM-dd-yyyy的格式,我想將它與當前日期進行比較,而日曆實例不遵循該格式,因此無法進行比較。 – Jayizzle