java中date代替_Java:为什么Date构造函数不推荐,我用什么来代替?
當(dāng)Java第一次啟動(dòng)和發(fā)展時(shí), java.util.Date , java.util.Calendar和java.text.SimpleDateFormat類被沖得太快了。 這些課程沒有很好的devise或?qū)嵤?試圖改進(jìn),因此你已經(jīng)發(fā)現(xiàn)的棄用。 不幸的是,改進(jìn)的嘗試很大程度上失敗 你應(yīng)該完全避免這些類 。 它們?cè)贘ava 8中被新類所取代。
在你的代碼中的問題
java.util.Date具有date和時(shí)間部分。 您忽略了代碼中的時(shí)間部分。 因此,Date類將按照J(rèn)VM的默認(rèn)時(shí)區(qū)定義的那一天開始,并將該時(shí)間應(yīng)用于Date對(duì)象。 所以你的代碼的結(jié)果將取決于它運(yùn)行的是哪臺(tái)機(jī)器或者哪個(gè)時(shí)區(qū)被設(shè)置。 可能不是你想要的。
如果您只想要date,而不需要時(shí)間部分,例如出生date,則可能不想使用Date對(duì)象。 您可能只想以YYYY-MM-DD ISO 8601格式存儲(chǔ)date的string。 或者使用Joda-Time中的LocalDate對(duì)象(見下文)。
喬達(dá)時(shí)間
在Java中學(xué)習(xí)的第一件事: 避免與Java捆綁在一起的臭名昭著的java.util.Date&java.util.Calendar類 。
正如在user3277382的答案中正確指出的那樣 ,在Java 8中使用Joda-Time或新的java.time。*包 。
Joda-Time中的示例代碼2.3
DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" ); DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway ); DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" ); DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork ); DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC ); LocalDate birthDate = new LocalDate( 1985, 1, 1 );
轉(zhuǎn)儲(chǔ)到控制臺(tái)…
System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway ); System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork ); System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt ); System.out.println( "birthDate: " + birthDate );
當(dāng)運(yùn)行…
birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00 birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00 birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z birthDate: 1985-01-01
java.time
在這種情況下, java.time的代碼與Joda-Time的代碼幾乎相同。
我們得到一個(gè)時(shí)區(qū)( ZoneId ),并構(gòu)造一個(gè)分配給該時(shí)區(qū)的date – 時(shí)間對(duì)象( ZonedDateTime )。 然后,使用不可變對(duì)象模式,我們基于舊對(duì)象的同一時(shí)刻(自時(shí)代以來的納秒數(shù))創(chuàng)build新的date時(shí)間,但分配了其他時(shí)區(qū)。 最后我們得到一個(gè)沒有時(shí)間和時(shí)區(qū)的LocalDate ,但是在確定這個(gè)date的時(shí)候會(huì)注意到這個(gè)時(shí)區(qū)的適用情況(比如在奧斯陸的一個(gè)新的一天比在紐約早)。
ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" ); ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway ); ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" ); ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork ); ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar. Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC. LocalDate localDate_Norway = zdt_Norway.toLocalDate();
關(guān)于java.time
java.time框架內(nèi)置于Java 8及更高版本中。 這些類取代了麻煩的舊的遺留date時(shí)間類,如java.util.Date , Calendar和SimpleDateFormat 。
Joda-Time項(xiàng)目現(xiàn)在處于維護(hù)模式 ,build議遷移到j(luò)ava.time類。
要了解更多信息,請(qǐng)參閱Oracle教程 。 并search堆棧溢出了很多例子和解釋。 規(guī)范是JSR 310 。
從何處獲取java.time類?
Java SE 8 , Java SE 9和更高版本
內(nèi)置。
帶有捆綁實(shí)現(xiàn)的標(biāo)準(zhǔn)Java API的一部分。
Java 9增加了一些小function和修復(fù)。
Java SE 6和Java SE 7
大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
Android的
ThreeTenABP項(xiàng)目專門針對(duì)Android,采用了ThreeTen-Backport (上文提到)。
請(qǐng)參閱如何使用ThreeTenABP …。
ThreeTen-Extra項(xiàng)目將java.time擴(kuò)展到其他類。 這個(gè)項(xiàng)目是未來可能增加java.time的一個(gè)試驗(yàn)場(chǎng)。 你可能會(huì)在這里find一些有用的類,比如Interval , YearWeek , YearQuarter 等等 。
總結(jié)
以上是生活随笔為你收集整理的java中date代替_Java:为什么Date构造函数不推荐,我用什么来代替?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RAM 1500 REV 纯电皮卡开放预
- 下一篇: java保持运行_保持Java程序无限运