摘要:開(kāi)源時(shí)間日期庫(kù)是很好的替代,另外中也推出了新的庫(kù),設(shè)計(jì)理念與相似。令時(shí)間和日期值變得易于管理操作和理解。格式化一個(gè)日期時(shí)間的具體域包括個(gè)年月日時(shí)分秒毫秒星期,分別用不同字母表示。
此前Java處理時(shí)間日期所使用的 Date 和 Calendar 被詬病不已,Calendar 的主要問(wèn)題對(duì)象可變,而像時(shí)間和日期這樣的類(lèi)應(yīng)該是不可變的,另外其概念模型也有不明確的地方,月份計(jì)算從0開(kāi)始等等。
JodaTime開(kāi)源時(shí)間/日期庫(kù)是很好的替代,另外Java8中也推出了新的java.time庫(kù),設(shè)計(jì)理念與JodaTime相似。
Joda-Time 令時(shí)間和日期值變得易于管理、操作和理解。易于使用是 Joda 的主要設(shè)計(jì)目標(biāo)。Joda-Time主類(lèi) DateTime 和JDK舊有類(lèi) Date 和 Calendar之間可以互相轉(zhuǎn)換。從而保證了與JDK框架的兼容。
1.JodaTime中的時(shí)間日期概念 1.1 Instant"蓋將自其變者而觀之,則天地曾不能以一瞬",Instant 就代表時(shí)間軸上的"一瞬",為保持和JDK一致,時(shí)間軸起點(diǎn)亦在1970年,單位為ms。
Instant類(lèi)的作用就圍繞著時(shí)間軸上的絕對(duì)時(shí)間(long類(lèi)型),提供了構(gòu)造,修改,加減等方法。另外它也是DateTime類(lèi)的構(gòu)建方式之一
DateTime dateTime = new DateTime(new Instant()); DateTime dateTime = new Instant().toDateTime();1.2 Interval
Interval代表一個(gè)Instant到下一個(gè)Instant的時(shí)間間隔,這個(gè)間隔是半開(kāi)閉集合。即包括起始的一瞬,但并不包含結(jié)束的一瞬。
1.3 DurationInstant表示時(shí)間軸上的一點(diǎn),Interval則表示時(shí)間軸上一段區(qū)間。
Duration指用ms計(jì)量的一段持續(xù)時(shí)間。Duration雖然與Interval看似類(lèi)似,但Duration的概念相對(duì)孤立,僅表示時(shí)間區(qū)間長(zhǎng)度,與時(shí)間軸上的位置沒(méi)有關(guān)系。
Duration 可以參與兩個(gè)Instant之間的運(yùn)算。
$$instant + duration = instant$$
1.4 PeriodPeriod表示用具體域(如年/月/日/時(shí)/分/秒/毫秒/星期)計(jì)量的一段時(shí)間,如3天,2小時(shí)等。這亦是與時(shí)間軸無(wú)關(guān)的一個(gè)概念,與Duration的不同只是在計(jì)量方式上。Duration與時(shí)區(qū)和歷法無(wú)關(guān),Period則與之相關(guān)。
Period概念之所以重要,可以想象在某年1月和7月的基礎(chǔ)上分別加 數(shù)值為1月的Period,則二者所需的具體時(shí)間ms值是不相同的。Period 是描述時(shí)間間隔長(zhǎng)度的另一種方式。
由上可見(jiàn)Period是與Duration同級(jí)別的概念,亦可以參與Instant的運(yùn)算。
$$instant + period = instant$$
另外也可以由 Interval 獲得相應(yīng)的Period和Duration。
DateTime now,then; Interval interval = new Interval(now,then); Period period = interval.toPeriod(); Duration duration = interval.toDuration();1.5 Chronology
Chronology代表歷法,負(fù)責(zé)具體時(shí)間日期的計(jì)算,雖然作用上居于核心位置,但在Api上卻容易被忽視。
使用者往往不需要指定具體的歷法,感受不到其存在。歷法類(lèi)是單例實(shí)現(xiàn),默認(rèn)實(shí)現(xiàn)是 ISOChronology。
代表時(shí)區(qū)。可以用來(lái)構(gòu)建歷法類(lèi)。
DateTimeZone zone = DateTimeZone.forID("Europe/London");1.7 Partial
Partial表示日期時(shí)間的一部分,是本地化時(shí)間,與時(shí)區(qū)無(wú)關(guān)。
例如一個(gè)TimeDate指定為2015年11月9日11時(shí)11分11秒,則在時(shí)間軸上為確定一點(diǎn);若省略掉年份時(shí)間信息,只取11月9日,則在時(shí)間軸上則對(duì)應(yīng)多點(diǎn),表示歷年來(lái)11月9日這一天的任意時(shí)間點(diǎn)。其實(shí)現(xiàn)類(lèi)有下列幾種:
LocalDate
LocalTime
LocalDateTime
YearMonth
MonthDay
由概念可知 為Partial指定其缺失域和時(shí)區(qū)信息,可以將其在時(shí)間軸上的位置確定下來(lái)。
$$partial + missing fields + time zone = instant$$
一個(gè)日期時(shí)間的具體域包括8個(gè):年/月/日/時(shí)/分/秒/毫秒 + 星期,分別用不同字母表示。
對(duì)于DateTime/LocalDate可以采用直接構(gòu)造格式化
DateTime dt = new DateTime(); String a = dt.toString(); String b = dt.toString("dd:MM:yy"); String c = dt.toString("EEE", Locale.FRENCH);
當(dāng)然這不過(guò)是個(gè)障眼法,真實(shí)的格式化工作由DateTimeFormatter完成,標(biāo)準(zhǔn)格式類(lèi)由ISODateTimeFormat提供。
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
如果要自定義格式化,需要?jiǎng)?chuàng)建DateTimeFormatter類(lèi)
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMddEE"); DateTimeFormatter germanFmt = fmt.withLocale(Locale.GERMAN); now.toString(fmt);
更詳細(xì)的流式構(gòu)造
DateTimeFormatter fmt = new DateTimeFormatterBuilder() .appendDayOfMonth(2) .appendLiteral("-") .appendMonthOfYearShortText() .appendLiteral("-") .appendTwoDigitYear(1956) // pivot = 1956 .toFormatter();1.9 不可變性
Joda 類(lèi)具有不可變性,因此它們的實(shí)例無(wú)法被修改。不可變類(lèi)的一個(gè)優(yōu)點(diǎn)就是它們是線程安全的。
2 DateTime使用 2.1 構(gòu)造方法DateTime 是Joda-Time的核心類(lèi),代表時(shí)間日期值,其構(gòu)造方法多樣,即可以使用各種對(duì)象構(gòu)造,亦可以使用基本類(lèi)型構(gòu)造,核心在于能夠確定在時(shí)間軸上的位置??梢詤⑴c構(gòu)造的對(duì)象包括:
Date - a JDK instant
Calendar - a JDK calendar
String - in ISO8601 format
Long - in milliseconds
any Joda-Time date-time class
int[]
2.2.獲取具體信息和屬性使用Joda-Time支持Date/Calendar構(gòu)造,保證了與JDK的兼容.
有了DateTime對(duì)象可以用get方法獲取從年到毫秒數(shù)的具體信息。以年為示例如下:
int year = dateTime.getYear(); int yearincenture = dateTime.getYearOfCentury(); int yearofera = dateTime.getYearOfEra();
DateTime還分別提供了一個(gè)內(nèi)部類(lèi) Property,Property的功能更加強(qiáng)大。DateTime的屬性有多種類(lèi)型,并支持修改。
Property p = now.year(); //年份 boolean isleap = p.isLeap(); //判斷是否是閏年 String name = p.getAsText(); Property p = now.monthOfYear();//當(dāng)年中的月份 p.setCopy(6); //將月份改為六月 Property p = now.dayOfMonth(); //當(dāng)月中的天數(shù) p.setCopy(9); //將天數(shù)改為當(dāng)月9號(hào) Property p = now.dayOfWeek(); //當(dāng)星期的天數(shù) p.setCopy(1); //將天數(shù)改為星期12.3.日期計(jì)算和不可變性(immutable)
DateTime對(duì)時(shí)間日期的計(jì)算主要針對(duì)7種域提供 with/plus/minus 三種方法。
DateTime dt = dateTime.plusYears(1);
2.4歷法和時(shí)區(qū)陷阱:因?yàn)椴豢勺冃?,DateTime修改之后得到的是一個(gè)新DateTime對(duì)象,這一點(diǎn)可以通過(guò)hashcode來(lái)驗(yàn)證,因此必須給這個(gè)新對(duì)象賦一個(gè)引用。
Joda-Time支持多種歷法和時(shí)區(qū),其中默認(rèn)歷法是ISO標(biāo)準(zhǔn)歷法,默認(rèn)時(shí)區(qū)與JDK相同。Joda-Time使用插件化(pluggable)機(jī)制,其中時(shí)區(qū)類(lèi)被設(shè)計(jì)成歷法類(lèi)的一個(gè)依賴。
Chronology類(lèi)表示對(duì)歷法抽象
DateTimeZone類(lèi)表示對(duì)時(shí)區(qū)的抽象
//1.指定歷法和時(shí)區(qū) DateTimeZone zone = DateTimeZone.forID("Asia/Tokyo"); Chronology gregorianJuian =GJChronology.getInstance(zone); DateTime daTime = new DateTime(gregorianJuian);
2.5 本地時(shí)間通過(guò)DateTimeZone.getAvailableIDs()可以獲取全部時(shí)區(qū)名稱.
LocalDate可以通過(guò)DateTime獲取,亦可以自行構(gòu)建。
LocalDate localDate= dateTime.toLocalDate(); LocalDate localDate = new LocalDate(2009, 9, 6);3. 時(shí)間處理示例 3.1 獲取當(dāng)前日期和年月日
LocalDate now = new LocalDate(); //DateTime now = new DateTime(); now.toString(); int year = now.getYear(); int month = now.getMonthOfYear(); int day = now.getDayOfWeek();3.2 獲取某個(gè)特定的日期
LocalDate now = new LocalDate(2015,11,9); DateTime now = new DateTime(2015,11,9,7,15);3.3 判斷兩個(gè)日期的關(guān)系
LocalDate now = new LocalDate(2015,11,9); LocalDate then = new LocalDate(2015,11,9); now.isEqual(then); now.isBefore(then); now.isAfter(then);3.4 修改/添加/減少日期
LocalDate now = new LocalDate(); then = now.plusYears(1); then = now.minusYears(1); then = now.withYear(2016);3.5 檢查重復(fù)日期,如生日
MonthDay birth = new MonthDay(11,9); LocalDate now = new LocalDate(); MonthDay today = new MonthDay(now); birth.isEqual(today);3.6 獲取1周/月/日后的日期
then = now.plusWeeks(1); then = now.plusMonths(1); then = now.plusDays(1);3.7 兩個(gè)日期之間包含多少天,多少個(gè)月
Period period = new Period(now,then); System.out.println(period.getDays()); System.out.println(period.getYears()); System.out.println(period.getMonths());3.8 獲得上個(gè)月最后一天
LocalDate now = new LocalDate(); LocalDate lastDayOfPreviousMonth = now.minusMonths(1). dayOfMonth().withMaximumValue();
3.9 計(jì)算 11 月中第一個(gè)星期一dayOfMonth方法返回了屬性(property)。
DateTime now = new DateTime(); now = now.monthOfYear().setCopy(11) .dayOfMonth().withMinimumValue()//獲得當(dāng)月1號(hào) .plusDays(6) .dayOfWeek().setCopy(1);//獲得星期一
當(dāng)?shù)玫奖驹?號(hào)后,使用dayOfWeek()將獲得1號(hào)所在的星期,直接使用setCopy(1)指定有可能會(huì)回到上個(gè)月月末的星期1.
因此使用plusDays(6)作預(yù)處理,即使用1當(dāng)月7號(hào)所在星期的星期1。
3.10 計(jì)算五年后的第二個(gè)月的最后一天:DateTime now = new DateTime(); DateTime then = now.plusYears(5) .monthOfYear() .setCopy(2) .dayOfMonth() .withMaximumValue();
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64739.html
摘要:新特性重要功能升級(jí)為了解決各種環(huán)境下如開(kāi)發(fā)測(cè)試和生產(chǎn)選擇不同配置的問(wèn)題,引入了環(huán)境功能。這個(gè)消息模塊支持的功能,同時(shí)提供了基于模板的方式發(fā)布消息是第一批支持特性的框架,比如它所支持的表達(dá)式。 Spring 3.1新特性 重要功能升級(jí) 為了解決各種環(huán)境下(如開(kāi)發(fā)、測(cè)試和生產(chǎn))選擇不同配置的問(wèn)題,Spring 3.1引入了環(huán)境profile功能。借助于profile,就能根據(jù)應(yīng)用部署在什...
摘要:本文是譯文,原文是我在原文的基礎(chǔ)上加了百度的圖表庫(kù),這個(gè)也是毫不遜色其他圖表庫(kù)的。更新記錄圖表類(lèi)數(shù)據(jù)驅(qū)動(dòng)文檔通常被稱為最強(qiáng)大的開(kāi)源可視化庫(kù)。是迄今為止最好的圖表庫(kù)。在頂級(jí)功能支持,使任何元素可拖動(dòng),可旋轉(zhuǎn)或可滑動(dòng)滾動(dòng)和快速性能的能力。 本文是譯文,原文是https://da-14.com/blog/top-11...我在原文的基礎(chǔ)上加了百度的Echats圖表庫(kù),這個(gè)也是毫不遜色其他圖表...
摘要:如圖所示還有其它很多項(xiàng)的更新,比如新增屬性,可以設(shè)置面板展開(kāi)時(shí)默認(rèn)顯示的日期。目前最新版本支持鍵盤(pán)可訪問(wèn)性的組件有。期待你的加入下個(gè)版本預(yù)告下個(gè)版本計(jì)劃重構(gòu)組件,以全面支持表單組件的鍵盤(pán)可訪問(wèn)性,敬請(qǐng)期待。 在過(guò)去的兩個(gè)多月里,iView 陸續(xù)發(fā)布了 2.9.0 和 2.10.0 兩個(gè)重要版本。這兩個(gè)版本總共有 255 個(gè) commit,超過(guò) 40 項(xiàng)更新。來(lái)看一下,iView 具體都...
摘要:彈出層是一個(gè)輕量級(jí)的庫(kù)用于管理工具提示和彈窗效果。一個(gè)帶有的跨瀏覽器富文本編輯器。由制作,適用于每天寫(xiě)作的富文本編輯器。輕量的操作庫(kù)。是一個(gè)快速簡(jiǎn)單輕量級(jí)的瀏覽器功能檢測(cè)庫(kù)。它沒(méi)有任何的依賴,并且壓縮后僅有。極小跨平臺(tái)的全屏插件。 在這里維持一個(gè)持續(xù)更新的地方 圖片 baguetteBox.js - 是一個(gè)簡(jiǎn)單易用的響應(yīng)式圖像燈箱效果腳本。demo Lightgallery.js -...
閱讀 2320·2021-11-15 11:38
閱讀 2450·2021-11-15 11:37
閱讀 2554·2021-08-24 10:00
閱讀 2915·2019-08-30 15:56
閱讀 1271·2019-08-30 15:53
閱讀 3709·2019-08-29 18:43
閱讀 2939·2019-08-29 17:01
閱讀 3262·2019-08-29 16:25