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