Joda Time使用小計

一、Joda Time基礎操作

1、 構造指定時間

// 明確給出年月日時分秒,同時還可以指定毫秒
DateTime dateTime = new DateTime(2017,9,14,20,30,0);  

// 使用時間戳構造
Datetime dateTime = new DateTime(1505371053358L);

// 使用字符串構造,使用字符串構造需要自己定義pattern
String date = "2017-09-14 20:30:00";
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime = dateTimeFormatter.parseDateTime(date);

// 指定時區構造時間
DateTime dateTime = new DateTime(DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Shanghai")));

注意:”Asia/Shanghai”是國際時區Id,該ID可以通過JDK代碼獲取,代碼如下:

Calendar c = new GregorianCalendar();  
c.setTime(new Date());  
String zone[] = c.getTimeZone().getAvailableIDs();  
for(int i = 0; i < zone.length; ++i){  
    System.out.println(zone[i]);  
}  

2、獲取當前時間的時間戳

// Java 
long currentTimeOfMills = System.currentTimeMillis();
// Joda Time
DateTime dateTime = new DateTime();
long currentTimeOfMills = dateTime.getMillis();

3、獲得當前時間的時區

DateTime dateTime = new DateTime();
DateTimeZone zone = dateTime.getZone();

4、 獲取指定時區的當前時間

DateTimeZone gmt = DateTimeZone.forID("GMT");
DateTime dateTime = new DateTime().toDateTime(gmt);

二、Joda Time 對年月日的一些簡單操作。

1、 獲取月初第一天和月末最後一天

DateTime dateTime = new DateTime();
// 月初第一天
DateTime theFirstDateOfMonth = dateTime.dayOfMonth().withMinimumValue();
//  當前月最後一天
DataTime theEndDataOfMonth = dateTime.dayOfMonth().withMaximumValue();

// 這一天是幾號
int day = dateTime.getDayOfMonth();
// 這一天是哪月
int month = dateTime.getMothOfYear();
// 這一天是哪年
int year = dateTime.getYear();
// 判斷本月是不是9月
if(dateTime.getDayOfMonth() == DateTimeConstants.SEPTEMBER){
//TODO
}

// 獲取相對於當前時間的月份,比如獲取上個月的時間或者下個月的是時間,方法minusMoths接受一個int的參數,如果這個參數等於0,代表本月,大於0代表已經過去的時間,小於0代表還沒有到來的時間
 LocalDate lastDayOfMonth = new LocalDate().minusMonths(1).dayOfMonth().withMaximumValue();

2、關於星期的操作

DateTime dateTime = new DateTime();
// 今天是星期幾
int week = dateTime.getDayOfWeek();
// 判斷今天是不是星期三
if(dateTime.getDayOfWeek() == DateTimeConstants.WEDNESDAY){
//TODO
}

注意:DateTimeConstants中包含了許多你需要的常量,而不用你自己去定義,比如星期、月份、上午還是下午都有哦

3、計算時間差
注意開始時間與結束時間參數位置,如果開始時間小於結束時間,得到的天數是正數,否則就是負數哦!

DateTime currentDateTime = new DateTime();
DateTime targetDateTime = new DateTime(2017,10,1,0,0,0);

// 相差多少年
int years = Years.yearsBetween(currentDateTime,targetDateTime).getYears();
// 相差多少月
int months = Months.monthsBetween(currentDateTime,targetDateTime).getMonths();
// 距離國慶放假還有多少天,嘎嘎!
int days = Days.daysBetween(currentDateTime,targetDateTime).getDays();
// 相差多少小時
int hours = Hours.hoursBetween(currentDateTime,targetDateTime).getHours();
// 相差多少分鐘
int minutes = Minutes.minutesBetween(currentDateTime,targetDateTime).getMinutes();
// 相差多少秒
int seconds = Seconds.secondsBetween(currentDateTime,targetDateTime).getSeconds();
// 相差多少周
int weeks = Weeks.weeksBetween(currentDateTime,targetDateTime).getWeeks();

4、獲取零點相關的時間

DateTime currentDateTime = new DateTime();
// 今天的零點
DateTime dateTime = currentDateTime.withMillisOfDay(0);
// 昨天的零點
DateTime dateTime = currentDateTime.withMillisOfDay(0).plusDays(-1);
// 明天的零點
DateTime dateTime = currentDateTime.withMillisOfDay(0).plusDays(1);
// 這一年最後一天0點
new DateTime().dayOfYear().withMaximumValue().withMillisOfDay(0)
// 這一年第一天0點
new DateTime().dayOfYear().withMinimumValue().withMillisOfDay(0)
// 這個月最後一天0點
new DateTime().dayOfMonth().withMaximumValue().withMillisOfDay(0)
// 這個月月初0點
new DateTime().dayOfMonth().withMinimumValue().withMillisOfDay(0)

注意:要獲取多少天后或者多少天前的零點,只需在plusDays()方法中填寫相應參數即可

三、準確使用Joda Time的時間處理類

1、格式化就這麼簡單

// 格式化時間
DateTime currentDateTime = new DateTime();
currentDateTime.toString("yyyy-MM-dd HH:mm:ss");

// 指定時區格式化
String format = "yyyy-MM-dd HH:mm:ss";
DateTime dateTime = new DateTime();
dateTime.toString(format, Locale.US);

// 格式化時分秒(單位毫秒並且最大可格式23:59:59,超出將報錯)
int millis = 120000;
LocalTime localTime = new LocalTime().withMillisOfDay(millis);
localTime.toString("HH:mm:ss");

2、 如果業務只需要日期,請使用LocalDate,因爲LocalDate僅僅關心日期,更專業,也減少了不必要的資源消耗;如果業務只關心時間,那麼使用LocalTime。例如:

LocalDate localDate = new LocalDate();
LocalTime localTime = new LocalTime();
System.out.println(localDate);
// 2017-09-14
System.out.println(localTime);
//10:54:14.506

3、 如果業務需要日期時間都要使用,那麼可以使用LocalDateTime,DateTime這兩個類,它們都是線程安全的同時都是不可變的,使用起來不用擔心出問題。
LocalDateTime是與時區無關的。
DateTime是與時區相關的一個國際標準時間。
使用的時候根據自己的需要選擇,詳細的解釋看官方文檔吧!

4、再次提醒要使用DateTimeConstants類定義好的常量,避免重複造輪子。下面給出DateTimeConstants類的常量(也不多),不在解釋,望名知義。

public static final int JANUARY = 1;
public static final int FEBRUARY = 2;
public static final int MARCH = 3;
public static final int APRIL = 4;
public static final int MAY = 5;
public static final int JUNE = 6;
public static final int JULY = 7;
public static final int AUGUST = 8;
public static final int SEPTEMBER = 9;
public static final int OCTOBER = 10;
public static final int NOVEMBER = 11;
public static final int DECEMBER = 12;
public static final int MONDAY = 1;
public static final int TUESDAY = 2;
public static final int WEDNESDAY = 3;
public static final int THURSDAY = 4;
public static final int FRIDAY = 5;
public static final int SATURDAY = 6;
public static final int SUNDAY = 7;
public static final int AM = 0;
public static final int PM = 1;
public static final int BC = 0;
public static final int BCE = 0;
public static final int AD = 1;
public static final int CE = 1;
public static final int MILLIS_PER_SECOND = 1000;
public static final int SECONDS_PER_MINUTE = 60;
public static final int MILLIS_PER_MINUTE = 60000;
public static final int MINUTES_PER_HOUR = 60;
public static final int SECONDS_PER_HOUR = 3600;
public static final int MILLIS_PER_HOUR = 3600000;
public static final int HOURS_PER_DAY = 24;
public static final int MINUTES_PER_DAY = 1440;
public static final int SECONDS_PER_DAY = 86400;
public static final int MILLIS_PER_DAY = 86400000;
public static final int DAYS_PER_WEEK = 7;
public static final int HOURS_PER_WEEK = 168;
public static final int MINUTES_PER_WEEK = 10080;
public static final int SECONDS_PER_WEEK = 604800;
public static final int MILLIS_PER_WEEK = 604800000;

由於小編能力有限,文中難免有紕漏之處,還望指正,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章