摘要:開源時(shí)間日期庫是很好的替代,另外中也推出了新的庫,設(shè)計(jì)理念與相似。令時(shí)間和日期值變得易于管理操作和理解。格式化一個(gè)日期時(shí)間的具體域包括個(gè)年月日時(shí)分秒毫秒星期,分別用不同字母表示。
此前Java處理時(shí)間日期所使用的 Date 和 Calendar 被詬病不已,Calendar 的主要問題對象可變,而像時(shí)間和日期這樣的類應(yīng)該是不可變的,另外其概念模型也有不明確的地方,月份計(jì)算從0開始等等。
JodaTime開源時(shí)間/日期庫是很好的替代,另外Java8中也推出了新的java.time庫,設(shè)計(jì)理念與JodaTime相似。
Joda-Time 令時(shí)間和日期值變得易于管理、操作和理解。易于使用是 Joda 的主要設(shè)計(jì)目標(biāo)。Joda-Time主類 DateTime 和JDK舊有類 Date 和 Calendar之間可以互相轉(zhuǎn)換。從而保證了與JDK框架的兼容。
1.JodaTime中的時(shí)間日期概念 1.1 Instant"蓋將自其變者而觀之,則天地曾不能以一瞬",Instant 就代表時(shí)間軸上的"一瞬",為保持和JDK一致,時(shí)間軸起點(diǎn)亦在1970年,單位為ms。
Instant類的作用就圍繞著時(shí)間軸上的絕對時(shí)間(long類型),提供了構(gòu)造,修改,加減等方法。另外它也是DateTime類的構(gòu)建方式之一
DateTime dateTime = new DateTime(new Instant()); DateTime dateTime = new Instant().toDateTime();1.2 Interval
Interval代表一個(gè)Instant到下一個(gè)Instant的時(shí)間間隔,這個(gè)間隔是半開閉集合。即包括起始的一瞬,但并不包含結(jié)束的一瞬。
1.3 DurationInstant表示時(shí)間軸上的一點(diǎn),Interval則表示時(shí)間軸上一段區(qū)間。
Duration指用ms計(jì)量的一段持續(xù)時(shí)間。Duration雖然與Interval看似類似,但Duration的概念相對孤立,僅表示時(shí)間區(qū)間長度,與時(shí)間軸上的位置沒有關(guān)系。
Duration 可以參與兩個(gè)Instant之間的運(yùn)算。
$$instant + duration = instant$$
1.4 PeriodPeriod表示用具體域(如年/月/日/時(shí)/分/秒/毫秒/星期)計(jì)量的一段時(shí)間,如3天,2小時(shí)等。這亦是與時(shí)間軸無關(guān)的一個(gè)概念,與Duration的不同只是在計(jì)量方式上。Duration與時(shí)區(qū)和歷法無關(guān),Period則與之相關(guān)。
Period概念之所以重要,可以想象在某年1月和7月的基礎(chǔ)上分別加 數(shù)值為1月的Period,則二者所需的具體時(shí)間ms值是不相同的。Period 是描述時(shí)間間隔長度的另一種方式。
由上可見Period是與Duration同級別的概念,亦可以參與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上卻容易被忽視。
使用者往往不需要指定具體的歷法,感受不到其存在。歷法類是單例實(shí)現(xiàn),默認(rèn)實(shí)現(xiàn)是 ISOChronology。
代表時(shí)區(qū)。可以用來構(gòu)建歷法類。
DateTimeZone zone = DateTimeZone.forID("Europe/London");1.7 Partial
Partial表示日期時(shí)間的一部分,是本地化時(shí)間,與時(shí)區(qū)無關(guān)。
例如一個(gè)TimeDate指定為2015年11月9日11時(shí)11分11秒,則在時(shí)間軸上為確定一點(diǎn);若省略掉年份時(shí)間信息,只取11月9日,則在時(shí)間軸上則對應(yīng)多點(diǎn),表示歷年來11月9日這一天的任意時(shí)間點(diǎn)。其實(shí)現(xiàn)類有下列幾種:
LocalDate
LocalTime
LocalDateTime
YearMonth
MonthDay
由概念可知 為Partial指定其缺失域和時(shí)區(qū)信息,可以將其在時(shí)間軸上的位置確定下來。
$$partial + missing fields + time zone = instant$$
一個(gè)日期時(shí)間的具體域包括8個(gè):年/月/日/時(shí)/分/秒/毫秒 + 星期,分別用不同字母表示。
對于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)然這不過是個(gè)障眼法,真實(shí)的格式化工作由DateTimeFormatter完成,標(biāo)準(zhǔn)格式類由ISODateTimeFormat提供。
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
如果要自定義格式化,需要?jiǎng)?chuàng)建DateTimeFormatter類
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 類具有不可變性,因此它們的實(shí)例無法被修改。不可變類的一個(gè)優(yōu)點(diǎn)就是它們是線程安全的。
2 DateTime使用 2.1 構(gòu)造方法DateTime 是Joda-Time的核心類,代表時(shí)間日期值,其構(gòu)造方法多樣,即可以使用各種對象構(gòu)造,亦可以使用基本類型構(gòu)造,核心在于能夠確定在時(shí)間軸上的位置。可以參與構(gòu)造的對象包括:
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對象可以用get方法獲取從年到毫秒數(shù)的具體信息。以年為示例如下:
int year = dateTime.getYear(); int yearincenture = dateTime.getYearOfCentury(); int yearofera = dateTime.getYearOfEra();
DateTime還分別提供了一個(gè)內(nèi)部類 Property,Property的功能更加強(qiáng)大。DateTime的屬性有多種類型,并支持修改。
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號 Property p = now.dayOfWeek(); //當(dāng)星期的天數(shù) p.setCopy(1); //將天數(shù)改為星期12.3.日期計(jì)算和不可變性(immutable)
DateTime對時(shí)間日期的計(jì)算主要針對7種域提供 with/plus/minus 三種方法。
DateTime dt = dateTime.plusYears(1);
2.4歷法和時(shí)區(qū)陷阱:因?yàn)椴豢勺冃裕珼ateTime修改之后得到的是一個(gè)新DateTime對象,這一點(diǎn)可以通過hashcode來驗(yàn)證,因此必須給這個(gè)新對象賦一個(gè)引用。
Joda-Time支持多種歷法和時(shí)區(qū),其中默認(rèn)歷法是ISO標(biāo)準(zhǔn)歷法,默認(rèn)時(shí)區(qū)與JDK相同。Joda-Time使用插件化(pluggable)機(jī)制,其中時(shí)區(qū)類被設(shè)計(jì)成歷法類的一個(gè)依賴。
Chronology類表示對歷法抽象
DateTimeZone類表示對時(shí)區(qū)的抽象
//1.指定歷法和時(shí)區(qū) DateTimeZone zone = DateTimeZone.forID("Asia/Tokyo"); Chronology gregorianJuian =GJChronology.getInstance(zone); DateTime daTime = new DateTime(gregorianJuian);
2.5 本地時(shí)間通過DateTimeZone.getAvailableIDs()可以獲取全部時(shí)區(qū)名稱.
LocalDate可以通過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號 .plusDays(6) .dayOfWeek().setCopy(1);//獲得星期一
當(dāng)?shù)玫奖驹?號后,使用dayOfWeek()將獲得1號所在的星期,直接使用setCopy(1)指定有可能會回到上個(gè)月月末的星期1.
因此使用plusDays(6)作預(yù)處理,即使用1當(dāng)月7號所在星期的星期1。
3.10 計(jì)算五年后的第二個(gè)月的最后一天:DateTime now = new DateTime(); DateTime then = now.plusYears(5) .monthOfYear() .setCopy(2) .dayOfMonth() .withMaximumValue();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64739.html
摘要:本文是譯文,原文是我在原文的基礎(chǔ)上加了百度的圖表庫,這個(gè)也是毫不遜色其他圖表庫的。更新記錄圖表類數(shù)據(jù)驅(qū)動文檔通常被稱為最強(qiáng)大的開源可視化庫。是迄今為止最好的圖表庫。在頂級功能支持,使任何元素可拖動,可旋轉(zhuǎn)或可滑動滾動和快速性能的能力。 本文是譯文,原文是https://da-14.com/blog/top-11...我在原文的基礎(chǔ)上加了百度的Echats圖表庫,這個(gè)也是毫不遜色其他圖表...
摘要:如圖所示還有其它很多項(xiàng)的更新,比如新增屬性,可以設(shè)置面板展開時(shí)默認(rèn)顯示的日期。目前最新版本支持鍵盤可訪問性的組件有。期待你的加入下個(gè)版本預(yù)告下個(gè)版本計(jì)劃重構(gòu)組件,以全面支持表單組件的鍵盤可訪問性,敬請期待。 在過去的兩個(gè)多月里,iView 陸續(xù)發(fā)布了 2.9.0 和 2.10.0 兩個(gè)重要版本。這兩個(gè)版本總共有 255 個(gè) commit,超過 40 項(xiàng)更新。來看一下,iView 具體都...
摘要:彈出層是一個(gè)輕量級的庫用于管理工具提示和彈窗效果。一個(gè)帶有的跨瀏覽器富文本編輯器。由制作,適用于每天寫作的富文本編輯器。輕量的操作庫。是一個(gè)快速簡單輕量級的瀏覽器功能檢測庫。它沒有任何的依賴,并且壓縮后僅有。極小跨平臺的全屏插件。 在這里維持一個(gè)持續(xù)更新的地方 圖片 baguetteBox.js - 是一個(gè)簡單易用的響應(yīng)式圖像燈箱效果腳本。demo Lightgallery.js -...
閱讀 2317·2021-11-15 11:38
閱讀 2447·2021-11-15 11:37
閱讀 2552·2021-08-24 10:00
閱讀 2912·2019-08-30 15:56
閱讀 1267·2019-08-30 15:53
閱讀 3707·2019-08-29 18:43
閱讀 2935·2019-08-29 17:01
閱讀 3259·2019-08-29 16:25