1. 程式人生 > >使用Joda DateTime處理時間

使用Joda DateTime處理時間

 

轉自: https://blog.csdn.net/psh18513234633/article/details/79408096

 

簡介

在Java中處理日期和時間是很常見的需求,基礎的工具類就是我們熟悉的Date和Calendar,然而這些工具類的api使用並不是很方便和強大,於是就誕生了Joda-Time這個專門處理日期時間的庫。在這裡記錄下使用方法,方便日後參考。 
api 官網 http://www.joda.org/joda-time/apidocs/index.html?overview-summary.html

引入MAVEN依賴

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.9.9</version>
</dependency>

核心類

使用最多的五個日期時間類: 
- Instant - 不可變的類,用來表示時間軸上一個瞬時的點(時間戳) 
- DateTime - 不可變的類,用來替換JDK的Calendar類 
LocalDate - 不可變的類,表示一個本地的日期,而不包含時間部分(沒有時區資訊) 
- LocalTime - 不可變的類,表示一個本地的時間,而不包含日期部分(沒有時區資訊) 
- LocalDateTime - 不可變的類,表示一個本地的日期-時間(沒有時區資訊)

DateTime的使用

DateTime 是JodaTime的核心類,代表時間日期值,其構造方法多樣,即可以使用各種物件構造,亦可以使用基本型別構造,核心在於能夠確定在時間軸上的位置。。預設構造器如下所示

DateTime dt = new DateTime();
  • 其他建構函式,可使用不同的建構函式快速獲取DateTime物件
DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour)
DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute)
DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute, int millisOfSecond)
DateTime(long instant)
DateTime(Object instant)
  • 還有一種方法就是使用靜態方法來獲取DateTime物件
now()                                           返回獲取當前DateTime
parse(String str, DateTimeFormatter formatter)  返回指定String值的DateTime

> parse demo
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime d3 = DateTime.parse("2016-10-10 11:12:55", formatter);
  • DateTime中的常用屬性值獲取方法
getCenturyOfEra()               返回世紀單位(int)
getYearOfCentury()              返回世紀年份(int)
getYear()                       返回年(int)
getWeekyear()                   返回對應年中週數(int)
getMonthOfYear()                返回對應年的月數(int)
getDayOfYear()                  返回對應年中天數(int)
getDayOfMonth()                 返回對應月份中天數(int)
getDayOfWeek()                  返回對應星期中天數(int)
getHourOfDay()                  返回對應天中的小時(int)
getMinuteOfDay()                返回對應天中的分鐘數(int)
getMinuteOfHour()               返回對應小時中的分鐘數(int)
getSecondOfDay()                返回對應天中的秒數(int)
getSecondOfMinute()             返回對應分鐘中的秒數(int)
getMillis()                     返回毫秒數(int)
getMillisOfDay()                返回對應天中的毫秒(int)
getMillisOfSecond()             返回對應秒中的毫秒(int)
getHourOfDay()                  返回對應天中的小時(int)
toString(String pattern)        返回一個規定格式的String

DateTime中的常用方法

1. plus/minus開頭的方法(比如:plusDay, minusMonths):用來返回在DateTime例項上增加或減少一段時間後的例項
plus(long duration)             增加指定毫秒數並返回
plusYears(int years)            增加指定年份並返回
plusMonths(int months)          增加指定月份並返回
plusWeeks(int weeks)            增加指定星期並返回
plusDays(int days)              增加指定天數並返回
plusHours(int hours)            增加指定小時並返回
plusMinutes(int minutes)        增加指定分鐘並返回
plusSeconds(int seconds)        增加指定秒數並返回
plusMillis(int millis)          增加指定毫秒並返回
-與之相反的是minus字首的 plus是增加 minus是減少

2. with開頭的方法:用來返回在DateTime例項更新指定日期單位後的例項
withCenturyOfEra(int centuryOfEra)  更新時間世紀單位並返回
withYearOfCentury(int yearOfCentury)更新世紀年並返回
withYear(int year)              更新時間年並返回
withWeekyear(int weekyear)      更新時間週數並返回
withMonthOfYear(int monthOfYear)更新時間月份並返回
withDayOfYear(int dayOfYear)    更新時間天數並返回
withDayOfMonth(int dayOfMonth)  更新時間天數並返回
withDayOfWeek(int dayOfWeek)    更新時間天數並返回
withHourOfDay(int hour)         更新時間小時並返回
withMinuteOfHour(int minute)    更新時間分鐘並返回
withSecondOfMinute(int second)  更新時間秒數並返回
withMillisOfSecond(int millis)  更新時間毫秒並返回
withMillisOfDay(int millis)     更新時間毫秒並返回
withTimeAtStartOfDay()          獲取當天最早時間

3. 判斷DateTime物件大小狀態的一些操作方法
compareTo(DateTime d)           比較兩時間大小 時間大於指定時間返回 1 時間小於指定時間返回-1 相等返回0
equals(DateTime d)              比較兩時間是否相等
isAfter(long instant)           判斷時間是否大於指定時間
isAfterNow()                    判斷時間是否大於當前時間
isBefore(long instant)          判斷時間是否小於指定時間
isBeforeNow()                   判斷時間是否小於當前時間
isEqual(long instant)           判斷時間是否等於指定時間
isEqualNow()                    判斷時間是否等於當前時間

4. jdk date互轉
DateTime dt = new DateTime(new Date()); jdk的date轉換為DateTime
Date jdkDate = dt.toDate()      轉換為jdk的date
  • ​​Property

除了基本get方法之外,jodatime為每一個時間類建立一個內部靜態類,叫Property,便於訪問例項中的各個欄位,使Joda Time功能更加豐富。

它相當於 Java物件的屬性。屬性是根據所表示的常見結構命名的,並且它被用於訪問這個結構,用於完成計算目的。

jodatime 包含的property有:

centuryOfEra()
yearOfCentury()
yearOfEra()
year()
weekyear()
weekOfWeekyear()
monthOfYear()
dayOfYear()
dayOfMonth()
dayOfWeek()
hourOfDay()
minuteOfDay()
minuteOfHour()
secondOfDay()
secondOfMinute()
millisOfDay()
millisOfSecond()

簡單的舉例

DateTime dt = new DateTime();
String monthStr = dt.monthOfYear().getAsText();     --> 十二月
int year = dt.monthOfYear().getAsText();            --> 2017
DateTime dtyear20 = dt.year().addToCopy(20);        --> 20年後的時間

方法

addToCopy(int value)            日期屬性增加value並返回datetime
setCopy(int value)              日期屬性替換成value並返回datetime
withMaximumValue()              返回日期屬性最大值的datetime
withMinimumValue()              返回日期屬性最小值的datetime
roundFloorCopy()                返回日期屬性最小值的datetime
roundCeilingCopy()              返回日期屬性最大值的datetime
get()                           返回日期屬性值int型別
getAsString()                   返回日期屬性值String型別
getAsShortText()                返回日期屬性值String型別簡寫
getAsText()                     返回日期本地屬性值String型別,如“星期五”
isLeap()                        判斷是閏年閏月的方法
getMaximumValue                 獲取屬性值的最大值返回int
getMinimumValue                 獲取屬性值的最小值返回int
  • LocalDate的使用

LocalDate只處理年月日

預設構造器

LocalDate() ld = new LocalDate();

其他構造器

LocalDate(int year, int monthOfYear, int dayOfMonth)
LocalDate(long instant)

方法跟DateTime方法類似,就不單獨整理了,可以去api檢視詳細方法

其他拓展方法

daysBetween(ReadableInstant start, ReadableInstant end)     獲取兩日期相差的天數
hoursBetween(ReadableInstant start, ReadableInstant end)    獲取兩日期相差的小時數
minutesBetween(ReadableInstant start, ReadableInstant end)  獲取兩日期相差的分鐘數
monthsBetween(ReadableInstant start, ReadableInstant end)   獲取兩日期相差的月數
secondsBetween(ReadableInstant start, ReadableInstant end)  獲取兩日期相差的秒數
weeksBetween(ReadableInstant start, ReadableInstant end)    獲取兩日期相差的週數
yearsBetween(ReadableInstant start, ReadableInstant end)    獲取兩日期相差的年數

> demo
LocalDate start = new LocalDate();
LocalDate end = new LocalDate().minusDays(1);
System.out.println(Days.daysBetween(start, end).getDays());