TL增加;博士
myJavaUtilDate.toInstant()
.atZone(ZoneId.of("America/Montreal"))
.toLocalDate()
.toString()
2017-01-23
日期 - 時間是不字符串
不要混淆代表其值字符串的日期時間對象。日期時間對象可以通過解析字符串來創建。日期時間對象可以生成一個字符串來表示它的值。但字符串和日期 - 時間對象是不同的和分離的。所以日期時間對象不會「有格式」。
使用java.time
您使用的是舊的麻煩日期時間類(Date
& Calendar
)是現在的傳統,由java.time類取代。
如果數據源(Swing)未被更新爲直接處理java.time類型,則轉換。尋找新的轉換方法添加到舊的類。
的Instant
類表示UTC與nanoseconds(最多9個(9)小數的位數)的分辨率在時間軸上的力矩。
Instant instant = myJavaUtilDate.toInstant() ;
instant.toString():2017-01-23T06:23:45。678Z
java.util.Date
和Instant
都是UTC。要確定日期,您必須指定一個時區。對於任何特定的時刻,日期在世界各地按區域而不同。例如,巴黎午夜過後的幾分鐘,法國是一個新的一天,而在魁北克蒙特利爾仍然是「昨天」。
在continent/region
的格式指定一個proper time zone name,如America/Montreal
,Africa/Casablanca
,或Pacific/Auckland
。切勿使用3-4字母縮寫,如EST
或IST
,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of("America/Montreal") ; // Or ZoneId.systemDefault()
ZonedDateTime zdt = instant.atZone(z);
zdt.toString():2017-01-23T01:23:45.678 + 05:00 [美國/蒙特利爾]
現在可以提取日期唯一部分。 LocalDate
類表示沒有時間和不帶時區的僅限日期的值。
LocalDate ld = zdt.toLocalDate();
你的問題不清楚你的目標。如果您只是要序列化此日期值以供以後比較,請以標準ISO 8601格式寫入文本。解析/生成字符串時,java.time類默認使用ISO 8601格式。
我建議你儘可能的堅持標準的ISO 8601字符串格式。它們旨在最大限度地減少歧義。它們很容易被機器解析。它們很容易被不同文化的人們閱讀。
String output = ld.toString() ;
2017年1月23日
如果你想一年,一個月的各個部分,並請將dayOfMonth,詢問LocalDate
對象。與傳統類不同,在java.time中,1月至12月的月份數目爲1-12。
int year = ld.getYear() ;
int month = ld.getMonthValue() ;
int dayOfMonth = ld.getDayOfMonth() ;
您還可以獲得強大的Month
枚舉對象的月份。
Month m = ld.getMonth();
關於java.time
的java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310。
從何處獲取java.time類?
的ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval
,YearWeek
,YearQuarter
和more。