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 }
例子
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)。