国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JodaTime開源時間/日期庫

frolc / 2768人閱讀

摘要:開源時間日期庫是很好的替代,另外中也推出了新的庫,設計理念與相似。令時間和日期值變得易于管理操作和理解。格式化一個日期時間的具體域包括個年月日時分秒毫秒星期,分別用不同字母表示。

此前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的時間間隔,這個間隔是半開閉集合。即包括起始的一瞬,但并不包含結束的一瞬。

Instant表示時間軸上的一點,Interval則表示時間軸上一段區間。

1.3 Duration

Duration指用ms計量的一段持續時間。Duration雖然與Interval看似類似,但Duration的概念相對孤立,僅表示時間區間長度,與時間軸上的位置沒有關系。

Duration 可以參與兩個Instant之間的運算。

$$instant + duration = instant$$

1.4 Period

Period表示用具體域(如年/月/日/時/分/秒/毫秒/星期)計量的一段時間,如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。

1.6 TimeZone

代表時區。可以用來構建歷法類。

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$$

1.8 格式化

一個日期時間的具體域包括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[]

Joda-Time支持Date/Calendar構造,保證了與JDK的兼容.

2.2.獲取具體信息和屬性使用

有了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); //將天數改為星期1
2.3.日期計算和不可變性(immutable)

DateTime對時間日期的計算主要針對7種域提供 with/plus/minus 三種方法。

DateTime dt = dateTime.plusYears(1);

陷阱:因為不可變性,DateTime修改之后得到的是一個新DateTime對象,這一點可以通過hashcode來驗證,因此必須給這個新對象賦一個引用。

2.4歷法和時區

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);

通過DateTimeZone.getAvailableIDs()可以獲取全部時區名稱.

2.5 本地時間

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();

dayOfMonth方法返回了屬性(property)。

3.9 計算 11 月中第一個星期一
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

相關文章

  • Spring新功能

    摘要:新特性重要功能升級為了解決各種環境下如開發測試和生產選擇不同配置的問題,引入了環境功能。這個消息模塊支持的功能,同時提供了基于模板的方式發布消息是第一批支持特性的框架,比如它所支持的表達式。 Spring 3.1新特性 重要功能升級 為了解決各種環境下(如開發、測試和生產)選擇不同配置的問題,Spring 3.1引入了環境profile功能。借助于profile,就能根據應用部署在什...

    baiy 評論0 收藏0
  • 12個值得關注的頂級可視化JS 涉及圖表、動畫、時間處理,表格操作

    摘要:本文是譯文,原文是我在原文的基礎上加了百度的圖表庫,這個也是毫不遜色其他圖表庫的。更新記錄圖表類數據驅動文檔通常被稱為最強大的開源可視化庫。是迄今為止最好的圖表庫。在頂級功能支持,使任何元素可拖動,可旋轉或可滑動滾動和快速性能的能力。 本文是譯文,原文是https://da-14.com/blog/top-11...我在原文的基礎上加了百度的Echats圖表庫,這個也是毫不遜色其他圖表...

    JinB 評論0 收藏0
  • iView 近期的更新,以及那些“不為人知”的故事

    摘要:如圖所示還有其它很多項的更新,比如新增屬性,可以設置面板展開時默認顯示的日期。目前最新版本支持鍵盤可訪問性的組件有。期待你的加入下個版本預告下個版本計劃重構組件,以全面支持表單組件的鍵盤可訪問性,敬請期待。 在過去的兩個多月里,iView 陸續發布了 2.9.0 和 2.10.0 兩個重要版本。這兩個版本總共有 255 個 commit,超過 40 項更新。來看一下,iView 具體都...

    UsherChen 評論0 收藏0
  • 推薦輕量高效無依賴的開源JS插件和

    摘要:彈出層是一個輕量級的庫用于管理工具提示和彈窗效果。一個帶有的跨瀏覽器富文本編輯器。由制作,適用于每天寫作的富文本編輯器。輕量的操作庫。是一個快速簡單輕量級的瀏覽器功能檢測庫。它沒有任何的依賴,并且壓縮后僅有。極小跨平臺的全屏插件。 在這里維持一個持續更新的地方 圖片 baguetteBox.js - 是一個簡單易用的響應式圖像燈箱效果腳本。demo Lightgallery.js -...

    AlphaWallet 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<