Joda Time使用小結

1、Joda Time基礎操做

一、 構造指定時間

// 明確給出年月日時分秒,同時還能夠指定毫秒
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代碼獲取,代碼以下:java

String[] zones = TimeZone.getAvailableIDs();
for (String zone : zones) {
    System.out.println(zone);
}
複製代碼

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

// JDK
long currentTimeOfMills = System.currentTimeMillis();
// Joda Time
long currentTimeOfMills = DateTime.now().getMillis();
複製代碼

三、得到當前時間的時區

DateTimeZone zone = DateTime.now().getZone();
複製代碼

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

DateTimeZone gmt = DateTimeZone.forID("GMT");
DateTime dateTime = DateTime.now().toDateTime(gmt);
複製代碼

2、Joda Time 對年月日的一些簡單操做。

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

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();
複製代碼

二、關於星期的操做

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

注意:DateTimeConstants中包含了許多你須要的常量,而不用你本身去定義,好比星期、月份、上午仍是下午都有哦安全

三、計算時間差

注意開始時間與結束時間參數位置,若是開始時間小於結束時間,獲得的天數是正數,不然就是負數哦!spa

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();
複製代碼

四、獲取零點相關的時間

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()方法中填寫相應參數便可線程

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

一、格式化就這麼簡單

// 格式化時間
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");
複製代碼

二、 若是業務只須要日期,請使用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
複製代碼

三、 若是業務須要日期時間都要使用,那麼可使用LocalDateTime, DateTime這兩個類,它們都是線程安全的同時都是不可變的,使用起來不用擔憂出問題。

LocalDateTime是與時區無關的。 DateTime是與時區相關的一個國際標準時間。 使用的時候根據本身的須要選擇,詳細的解釋看官方文檔吧!code

四、再次提醒要使用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;
// 1秒對應毫秒數
public static final int MILLIS_PER_SECOND = 1000;
// 1分鐘對應秒數
public static final int SECONDS_PER_MINUTE = 60;
// 1分鐘對應毫秒數
public static final int MILLIS_PER_MINUTE = 60000;
// 1小時對應分鐘數
public static final int MINUTES_PER_HOUR = 60;
// 1小時對應的秒數
public static final int SECONDS_PER_HOUR = 3600;
// 1小時對應的毫秒數
public static final int MILLIS_PER_HOUR = 3600000;
// 1天對應的小時
public static final int HOURS_PER_DAY = 24;
// 1天對應的分鐘數
public static final int MINUTES_PER_DAY = 1440;
// 1天對應的秒數
public static final int SECONDS_PER_DAY = 86400;
// 1天對應的毫秒數
public static final int MILLIS_PER_DAY = 86400000;
// 1周對應的天數
public static final int DAYS_PER_WEEK = 7;
// 1周對應的小時
public static final int HOURS_PER_WEEK = 168;
// 1周對應的分鐘
public static final int MINUTES_PER_WEEK = 10080;
// 1周對應的秒數
public static final int SECONDS_PER_WEEK = 604800;
// 1周對應的毫秒數
public static final int MILLIS_PER_WEEK = 604800000;
複製代碼
相關文章
相關標籤/搜索