1 package com.jansh.comm.util; 2 3 import java.time.Clock; 4 import java.time.LocalDate; 5 import java.time.LocalDateTime; 6 import java.time.LocalTime; 7 import java.time.Period; 8 import java.time.format.DateTimeFormatter; 9 10 /** 11 * 日期時間工具類 12 * 13 * @author nie 14 * 15 */ 16 public class DateUtil { 17 /** 18 * yyyyMMddHHmmss 19 */ 20 public static final DateTimeFormatter formatter_DateTimestamp = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 21 /** 22 * yyyy-MM-dd HH:mm:ss 23 */ 24 public static final DateTimeFormatter formatter_DateTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 25 26 /** 27 * 獲取當前日期 28 * 29 * @return 30 */ 31 public static LocalDate getLocalDate() { 32 return LocalDate.now(); 33 } 34 35 /** 36 * 獲取當前時間 37 * 38 * @return 39 */ 40 public static LocalTime getLocalTime() { 41 return LocalTime.now(); 42 } 43 44 /** 45 * 獲取當前日期時間 46 * 47 * @return 48 */ 49 public static LocalDateTime getLocalDateTime() { 50 return LocalDateTime.now(); 51 } 52 53 /** 54 * 獲取當前的微秒數 55 * 56 * @return 57 */ 58 public static long getClockMillis() { 59 Clock clock = Clock.systemDefaultZone(); 60 return clock.millis(); 61 } 62 63 /** 64 * 返回當前時間yyyyMMddHHmmss 65 * 66 * @return 67 */ 68 public static String getDateTimestamp() { 69 return getLocalDateTime().format(formatter_DateTimestamp); 70 } 71 72 /** 73 * 返回當前時間yyyy-MM-dd 74 * 75 * @return 76 */ 77 public static String getDate() { 78 return getLocalDate().format(DateTimeFormatter.ISO_LOCAL_DATE); 79 } 80 81 /** 82 * 返回當前系統時間 yyyy-MM-dd HH:mm:ss 83 * 84 * @return 返回當前系統時間 85 */ 86 public static String getDateTime() { 87 return getLocalDateTime().format(formatter_DateTime); 88 } 89 90 /** 91 * 獲取當月第一天 yyyy-MM-dd 92 * 93 * @return 94 */ 95 public static String getFirstDayOfMonth() { 96 return getLocalDate().withDayOfMonth(1).format(DateTimeFormatter.ISO_LOCAL_DATE); 97 } 98 99 /** 100 * 獲取本月最後一天 yyyy-MM-dd 101 * 102 * @return 103 */ 104 public static String getLastDayOfMonth() { 105 LocalDate localDate = getLocalDate(); 106 return localDate.withDayOfMonth(localDate.lengthOfMonth()).format(DateTimeFormatter.ISO_LOCAL_DATE); 107 } 108 109 /** 110 * 將yyyyMMddHHmmss轉爲 yyyy-MM-dd HH:mm:ss 111 * 112 * @param time 113 * @return 114 */ 115 public static String formatDateTimestamp(String dateTimestamp) { 116 return LocalDateTime.parse(dateTimestamp, formatter_DateTimestamp).format(formatter_DateTime); 117 } 118 119 /** 120 * 將yyyy-MM-dd HH:mm:ss轉爲 yyyyMMddHHmmss 121 */ 122 public static String formatDateTime(String dateTime) { 123 return parseLocalDateTime(dateTime).format(formatter_DateTimestamp); 124 } 125 126 /** 127 * 將yyyy-MM-dd HH:mm:ss轉爲 LocalDateTime 128 */ 129 public static LocalDateTime parseLocalDateTime(String dateTime) { 130 return LocalDateTime.parse(dateTime, formatter_DateTime); 131 } 132 133 /** 134 * 將yyyyMMddHHmmss轉爲 LocalDateTime 135 */ 136 public static LocalDateTime parseLocalDateTimestamp(String dateTimestamp) { 137 return LocalDateTime.parse(dateTimestamp, formatter_DateTimestamp); 138 } 139 140 /** 141 * yyyy-MM-dd字符串轉LocalDate 142 * 143 * @param dateString 144 * @return 145 */ 146 public static LocalDate parseLocalDate(String dateString) { 147 return LocalDate.parse(dateString, DateTimeFormatter.ISO_LOCAL_DATE); 148 } 149 150 /** 151 * yyyy-MM-dd 增長日期 152 * 153 * @param date 154 * @param day 155 * @return 156 */ 157 public static String plusDays(String date, int days) { 158 LocalDate localDate = parseLocalDate(date); 159 return localDate.plusDays(days).format(DateTimeFormatter.ISO_LOCAL_DATE); 160 } 161 162 /** 163 * 計算兩個日期之間相差的天數 164 * 165 * @param startDate 166 * 較小的時間 yyyy-MM-dd 167 * @param endDate 168 * 較大的時間 yyyy-MM-dd 169 * @return 相差天數 170 */ 171 public static int dateCompareTo(String startDate, String endDate) { 172 LocalDate startLocalDate = LocalDate.parse(startDate, DateTimeFormatter.ISO_LOCAL_DATE); 173 LocalDate endLocalDate = LocalDate.parse(endDate, DateTimeFormatter.ISO_LOCAL_DATE); 174 Period period = Period.between(startLocalDate, endLocalDate); 175 return period.getDays(); 176 } 177 178 public static void main(String[] args) { 179 System.out.println(getDateTimestamp()); 180 System.out.println(getDateTime()); 181 System.out.println(getLocalDate().withDayOfMonth(1)); 182 System.out.println(getLocalDate().withDayOfMonth(getLocalDate().lengthOfMonth())); 183 System.out.println(plusDays("2016-08-31", 1)); 184 System.out.println(dateCompareTo("2016-08-21", "2016-08-30")); 185 System.out.println(getClockMillis()); 186 System.out.println(LocalDateTime.parse("2016-08-31 11:39:14", formatter_DateTime) 187 .format(DateTimeFormatter.ISO_LOCAL_DATE)); 188 189 } 190 191 }
例子java
1 包概述 2 java.time 包是在JDK8新引入的,提供了用於日期、時間、實例和週期的主要API。 3 java.time包定義的類表示了日期-時間概念的規則,包括instants, durations, dates, times, time-zones and periods。這些都是基於ISO日曆系統,它又是遵循 Gregorian規則的。 4
5 全部類都是不可變的、線程安全的。 6
7 一些類的介紹 8 LocalDateTime:存儲了日期和時間,如:2013-10-15T14:43:14.539。 9 LocalDate:存儲了日期,如:2013-10-15。 10 LocalTime:存儲了時間,如:14:43:14.539。 11 上面的類能夠由下面的類組合來: 12 Year:表示年份。 13 Month:表示月份。 14 YearMonth:表示年月。 15 MonthDay:表示月日。 16 DayOfWeek:存儲星期的一天。 17
18 類之間轉換的示例: 19 LocalDateTime localDateTime = LocalDateTime.now(); 20 System.out.println("localDateTime :" + localDateTime); 21
22 LocalDate localDate = LocalDate.now(); 23 System.out.println("localDate :" + localDate); 24
25 LocalTime localtime = LocalTime.now(); 26 System.out.println("localtime :" + localtime); 27
28 // 獲取當前年份 29 Year year = Year.now(); 30 System.out.println("year :" + year); 31 // 從Year獲取LocalDate 32 LocalDate localDate1 = year.atDay(59); 33 System.out.println("localDate1 :" + localDate1); 34 // 把LocalTime關聯到一個LocalDate獲得一個LocalDateTime 35 LocalDateTime localDateTime1 = localtime.atDate(localDate1); 36 System.out.println("localDateTime1 :" + localDateTime1); 37
38 // 用指定的年獲取一個Year 39 Year year1 = Year.of(2012); 40 System.out.println("year1 :" + year1); 41
42 // 從Year獲取YearMonth 43 YearMonth yearMonth = year1.atMonth(2); 44 System.out.println("yearMonth :" + yearMonth); 45 // YearMonth指定日獲得 LocalDate 46 LocalDate localDate2 = yearMonth.atDay(29); 47 System.out.println("localDate2 :" + localDate2); 48 // 判斷是不是閏年 49 System.out.println("isLeapYear :" + localDate2.isLeapYear()); 50
51 //自動處理閏年的2月日期 52 //建立一個 MonthDay 53 MonthDay monthDay = MonthDay.of(2, 29); 54 LocalDate leapYear = monthDay.atYear(2012); 55 System.out.println("leapYear :" + leapYear); 56
57 //同一個 MonthDay 關聯到另外一個年份上 58 LocalDate nonLeapYear = monthDay.atYear(2011); 59 System.out.println("nonLeapYear :" + nonLeapYear); 60
61 上面代碼的輸出結果爲: 62 localDateTime :2013-10-15T15:11:57.489 63 localDate :2013-10-15 64 localtime :15:11:57.489 65 year :2013 66 localDate1 :2013-02-28 67 localDateTime1 :2013-02-28T15:11:57.489 68 year1 :2012 69 yearMonth :2012-02 70 localDate2 :2012-02-29 71 isLeapYear :true 72 leapYear :2012-02-29 73 nonLeapYear :2011-02-28 74
75
76 格式化與時間計算 77 DateTimeFormatter:在日期對象與字符串之間進行轉換。 78 ChronoUnit:計算出兩個時間點之間的時間距離,可按多種時間單位計算。 79 TemporalAdjuster:各類日期計算功能。 80 續前面的代碼: 81 DayOfWeek dayOfWeek = DayOfWeek.of(1); 82 System.out.println("dayOfWeek :" + dayOfWeek); 83
84 //計算兩個日期之間的天數,還能夠按其餘時間單位計算兩個時間點之間的間隔。 85 long between = ChronoUnit.DAYS.between(localDate, leapYear); 86 System.out.println("between :" + between); 87
88 // 線程安全的格式化類,不用每次都new個SimpleDateFormat 89 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu MM dd"); 90
91 // 把日期時間轉換爲字符串標識 92 System.out.println("date formatter :" + dateTimeFormatter.format(nonLeapYear)); 93
94 // 解析字符串形式的日期時間 95 TemporalAccessor temporalAccessor = dateTimeFormatter.parse("2013 01 15"); 96 System.out.println("temporalAccessor :" + LocalDate.from(temporalAccessor)); 97
98 Instant instant = Instant.now(); // 時間戳 99 System.out.println("instant :" + instant); 100
101 //計算某月的第一天的日期 102 LocalDate with = nonLeapYear.with(TemporalAdjuster.firstDayOfMonth()); 103 System.out.println("with :" + with); 104
105 // 計算某月的第一個星期一的日期 106 TemporalAdjuster temporalAdjuster = TemporalAdjuster.firstInMonth(DayOfWeek.MONDAY); 107 LocalDate with1 = localDate.with(temporalAdjuster); 108 System.out.println("with1 :" + with1); 109
110 // 計算localDate的下一個星期一的日期 111 LocalDate with2 = localDate.with(TemporalAdjuster.next(DayOfWeek.MONDAY)); 112 System.out.println("with2 :" + with2); 113 輸出: 114 dayOfWeek :MONDAY 115 between :-594 116 date formatter :2011 02 28 117 temporalAccessor :2013-01-15 118 instant :2013-10-15T07:55:30.964Z 119 with :2011-02-01 120 with1 :2013-10-07 121 with2 :2013-10-21 122
123
124 java.util.Date到新庫類的轉換 125 轉換可經過下面的方法進行。 126 Date.toInstant() 127 Date.from(Instant) 128 Calendar.toInstant() 129 方法概覽 130 該包的API提供了大量相關的方法,這些方法通常有一致的方法前綴: 131 of:靜態工廠方法。 132 parse:靜態工廠方法,關注於解析。 133 get:獲取某些東西的值。 134 is:檢查某些東西的是不是true。 135 with:不可變的setter等價物。 136 plus:加一些量到某個對象。 137 minus:從某個對象減去一些量。 138 to:轉換到另外一個類型。 139 at:把這個對象與另外一個對象組合起來,例如:date.atTime(time)。