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)。