Java時間類總結

java時間類總結

jdk1.8之前

java.util.Date

包含有年月日時分秒,精確到毫秒級別。

// The class Date represents a specific instant in time, with millisecond precision.
// 語句
Date date = new Date();
System.out.println(date);

//輸出結果
Sat Feb 03 14:48:47 CST 2018
java.sql.Date

包含年月日,時分秒都被設置爲0,之所以這樣設計是爲了適應SQL中的DATE類型。

// A thin wrapper around a millisecond value that allows JDBC to identify this as an SQL DATE value. A milliseconds value represents the number of milliseconds that have passed since January 1, 1970 00:00:00.000 GMT.
// To conform with the definition of SQL DATE, the millisecond values wrapped by a java.sql.Date instance must be 'normalized' by setting the hours, minutes, seconds, and milliseconds to zero in the particular time zone with which the instance is associated.

注意,雖然說這個類是使用年月日的,但是初始化的時候,需要一個long類型的參數,這個參數代表着January 1, 1970, 00:00:00 GMT到某個時間的毫秒數。如果是當前時間的話,可以用System.currentTimeMillis()或者new Date().getTime()獲取。

// 語句
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
System.out.println(sqlDate);

// 輸出結果
2018-02-03
java.sql.Time

包含時分秒,這個也是爲了SQL中的TIME類型而出現的。

// 語句
Time time = new Time(System.currentTimeMillis());
System.out.println(time);

// 輸出結果
15:07:35
java.sql.Timestamp

時間戳,適配於SQL中的TIMESTAMP類型而出現的,精確到納秒級別。

jdk1.8

java.time.LocalDate

LocalDate提供年月日而不提供時分秒信息,它是不可變類且線程安全的。它經常被用於展示year-month-day,day-of-year,day-of-week,week-of-year等格式的信息。

LocalDate localDate = LocalDate.now();
// 獲取當天是幾號
int dayOfMonth = localDate.getDayOfMonth();
// 獲取當天是星期幾
DayOfWeek dayOfWeek = localDate.getDayOfWeek();

// 獲取本月的第一天
LocalDate firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth());
// 取本月最後一天
LocalDate lastDayOfThisMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());
java.time.Time

提供時分秒不提供年月日,也是線程安全並且不可變類。它經常被用於展示hour-minute-second格式的信息。可以對時間進行加減等操作。

// 樣例
LocalTime localTime = LocalTime.now();
// 獲取當前的小時
int hour = localTime.getHour();
System.out.println(hour);
// 小時數加1
LocalTime addTwoHours = localTime.plusHours(2L);
System.out.println(addTwoHours.getHour());

// 結果
16
18
java.time.LocalDateTime

包含年月日時分秒,精確到納秒級別,同樣是線程安全並且不可變類。它可以操作時間中的年月日時分秒並且可以獲取其中的屬性。

LocalDateTime localDateTime = LocalDateTime.now();
// 獲取年
int year = localDateTime.getYear();
// 獲取小時
int hour = localDateTime.getHour();
// 增加一年
LocalDateTime addOneYear = localDateTime.plusYears(1);

其它

格式化輸出:java.text.SimpleDateFormat

這個類提供時間的各種格式化輸出和將字符串轉換爲時間類,簡單來說,它擁有date → text 以及text → date的能力。
例如:將Date格式化輸出

// 格式化輸出
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss");
String dateStr = sdf.format(new Date());
System.out.println(dateStr);

// 結果
2018020315:20:58

例如:將時間字符串轉化爲Date

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss");
Date date = sdf.parse("2018年02月03日  15:20:58");

注意,SimpleDateFormat.parse(String source)中的source格式一定得是SimpleDateFormat當前使用的格式。如這個例子中使用了yyyy年MM月dd日 HH:mm:ss,所以傳入了2018年02月03日 15:20:58時間字符串。
PS:有些同學對yyyy或者MM這些字母代表的含義不懂的話,建議使用這個類的時候,看一下源碼,源碼類上都有對這些字母的解釋。

java.util.Calendar

日曆類,這個類大多被用於獲取時間的特殊屬性,比如說獲取某個時間對象的年份、月份、星期等

Calendar calendar = Calendar.getInstance();
// 設置時間,不設置的話,默認是當前時間
calendar.setTime(new Date());
// 獲取時間中的年份
int year = calendar.get(Calendar.YEAR);
//設置當月最後一天
calendar.set(Calendar.DAY_OF_MONTH,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));

//設置當週最後一天
//一週第一天是否爲星期天
boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY);
if(isFirstSunday){
    calendar.set(Calendar.DAY_OF_WEEK,calendar.getActualMaximum(Calendar.DAY_OF_WEEK));
    calendar.add(Calendar.DATE, 1);
}else{
    calendar.set(Calendar.DAY_OF_WEEK,calendar.getActualMaximum(Calendar.DAY_OF_WEEK));
}
//結合SimpleDateFormat 格式化輸出
sdf.format(calendar.getTime())        

注: Java中Calendar.DAY_OF_WEEK表示一週中的第幾天,所以他會受到 第一天是星期幾 的影響。
有些地區以星期日作爲一週的第一天,而有些地區以星期一作爲一週的第一天,需要加以區分。

從JDK1.8開始,Calendar增加新的構造方式

// since jdk 1.8
Calendar calendar = new Calendar.Builder().setDate(2018, 3, 25).build();
int year = calendar.get(Calendar.YEAR);
System.out.println(year);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章