import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import java.util.Objects;
/**
* 基于java 8 的时间工具类
*
* @author it
* @date 2019年5月6日
*/
public class LocalDateTimeUtil {
private static final ZoneId defaultZoneId = ZoneId.systemDefault();
// 获取到日期时间
public static LocalDateTime systemLocalDateTime() {
return LocalDateTime.now();
}
public static LocalDateTime toLocalDateTime(Date date) {
Objects.requireNonNull(date, "date");
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(date.toInstant(), defaultZoneId);
return zonedDateTime.toLocalDateTime();
}
public static Date systemDate() {
LocalDateTime localDateTime = systemLocalDateTime();
ZonedDateTime zone = localDateTime.atZone(defaultZoneId);
return Date.from(zone.toInstant());
}
public static Date toDate(LocalDateTime localDateTime) {
Objects.requireNonNull(localDateTime, "localDateTime");
ZonedDateTime zone = localDateTime.atZone(defaultZoneId);
return Date.from(zone.toInstant());
}
public static LocalDate toLocalDate(LocalDateTime localDateTime) {
return localDateTime.toLocalDate();
}
public static LocalTime toLocalTime(LocalDateTime localDateTime) {
return localDateTime.toLocalTime();
}
// 格式转换统一方法
public static String format(LocalDateTime localDateTime, String formatStyle) {
Objects.requireNonNull(localDateTime, "localDateTime");
Objects.requireNonNull(formatStyle, "formatStyle");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatStyle);
return localDateTime.format(formatter);
}
public static LocalDateTime parse(String text, String formatStyle) {
Objects.requireNonNull(text, "text");
Objects.requireNonNull(formatStyle, "formatStyle");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatStyle);
return LocalDateTime.parse(text, formatter);
}
/**
* @Description: 基于格式转换统一方法精简封装
* @use:
*
* <pre>
* LocalDateTime localDateTime = LocalDateTimeUtil.Format.FORMAT_NOLINE_YYYYMMDD24HHMMSS.parse(text);
* </pre>
*
* @author it
* @date 2019年5月6日
*
*/
public enum Format {
FORMAT_YYMMDD {
public String format(LocalDateTime localDateTime) {
return LocalDateTimeUtil.format(localDateTime, FormatStyle.FORMAT_YYMMDD);
}
public LocalDateTime parse(String text) {
return LocalDateTimeUtil.parse(text, FormatStyle.FORMAT_YYMMDD);
}
},
FORMAT_YYYYMMDD24HHMMSS {
public String format(LocalDateTime localDateTime) {
return LocalDateTimeUtil.format(localDateTime, FormatStyle.FORMAT_YYYYMMDD24HHMMSS);
}
public LocalDateTime parse(String text) {
return LocalDateTimeUtil.parse(text, FormatStyle.FORMAT_YYYYMMDD24HHMMSS);
}
},
FORMAT_YYYYMMDD24HHMMSSSSS {
public String format(LocalDateTime localDateTime) {
return LocalDateTimeUtil.format(localDateTime, FormatStyle.FORMAT_YYYYMMDD24HHMMSSSSS);
}
public LocalDateTime parse(String text) {
return LocalDateTimeUtil.parse(text, FormatStyle.FORMAT_YYYYMMDD24HHMMSSSSS);
}
},
FORMAT_NOLINE_YYMMDD {
public String format(LocalDateTime localDateTime) {
return LocalDateTimeUtil.format(localDateTime, FormatStyle.FORMAT_NOLINE_YYMMDD);
}
public LocalDateTime parse(String text) {
return LocalDateTimeUtil.parse(text, FormatStyle.FORMAT_NOLINE_YYMMDD);
}
},
FORMAT_NOLINE_YYYYMMDD24HHMMSS {
public String format(LocalDateTime localDateTime) {
return LocalDateTimeUtil.format(localDateTime, FormatStyle.FORMAT_NOLINE_YYYYMMDD24HHMMSS);
}
public LocalDateTime parse(String text) {
return LocalDateTimeUtil.parse(text, FormatStyle.FORMAT_NOLINE_YYYYMMDD24HHMMSS);
}
},
FORMAT_NOLINE_YYYYMMDDHHMMSS {
public String format(LocalDateTime localDateTime) {
return LocalDateTimeUtil.format(localDateTime, FormatStyle.FORMAT_NOLINE_YYYYMMDDHHMMSS);
}
public LocalDateTime parse(String text) {
return LocalDateTimeUtil.parse(text, FormatStyle.FORMAT_NOLINE_YYYYMMDDHHMMSS);
}
},
FORMAT_NOLINE_YYYYMMDD24HHMMSSSSS {
public String format(LocalDateTime localDateTime) {
return LocalDateTimeUtil.format(localDateTime, FormatStyle.FORMAT_NOLINE_YYYYMMDD24HHMMSSSSS);
}
public LocalDateTime parse(String text) {
return LocalDateTimeUtil.parse(text, FormatStyle.FORMAT_NOLINE_YYYYMMDD24HHMMSSSSS);
}
},
FORMAT_NOLINE_YYYYMMDD24HHMM {
public String format(LocalDateTime localDateTime) {
return LocalDateTimeUtil.format(localDateTime, FormatStyle.FORMAT_NOLINE_YYYYMMDD24HHMM);
}
public LocalDateTime parse(String text) {
return LocalDateTimeUtil.parse(text, FormatStyle.FORMAT_NOLINE_YYYYMMDD24HHMM);
}
},
FORMAT_24HHMMSS {
public String format(LocalDateTime localDateTime) {
return LocalDateTimeUtil.format(localDateTime, FormatStyle.FORMAT_24HHMMSS);
}
public LocalDateTime parse(String text) {
return LocalDateTimeUtil.parse(text, FormatStyle.FORMAT_24HHMMSS);
}
},
FORMAT_YYYYMM {
public String format(LocalDateTime localDateTime) {
return LocalDateTimeUtil.format(localDateTime, FormatStyle.FORMAT_YYYYMM);
}
public LocalDateTime parse(String text) {
return LocalDateTimeUtil.parse(text, FormatStyle.FORMAT_YYYYMM);
}
};
public String format(LocalDateTime localDateTime) {
throw new AbstractMethodError();
}
public LocalDateTime parse(String text) {
throw new AbstractMethodError();
}
}
/**
* @Description: 格式设置,自定义格式满足yyyy(年) MM(月) dd(日) HH(时) mm(分) ss(秒) SSS(毫秒)
* @author it
* @date 2019年5月6日
*/
public interface FormatStyle {
String FORMAT_YYMMDD = "yyyy-MM-dd";
String FORMAT_YYYYMMDD24HHMMSS = "yyyy-MM-dd HH:mm:ss";
String FORMAT_YYYYMMDD24HHMMSSSSS = "yyyy-MM-dd HH:mm:ss.SSS";
String FORMAT_NOLINE_YYMMDD = "yyyyMMdd";
String FORMAT_NOLINE_YYYYMMDD24HHMMSS = "yyyyMMddHHmmss";
String FORMAT_NOLINE_YYYYMMDDHHMMSS = "yyyymmddhhmmss";
String FORMAT_NOLINE_YYYYMMDD24HHMMSSSSS = "yyyyMMddHHmmssSSS";
String FORMAT_NOLINE_YYYYMMDD24HHMM = "yyyyMMddHHmm";
String FORMAT_24HHMMSS = "HH:mm:ss";
String FORMAT_YYMM = "yyMM";
String FORMAT_YYYYMM = "yyyyMM";
String FORMAT_YYYY = "yyyy";
String FORMAT_MM = "MM";
String FORMAT_DD = "dd";
String FORMAT_HH = "HH";
String FORMAT_mm = "mm";
}
// 请不要直接在LocalDateTimeUtils类中添加无用的方法,请添加在这里
public static class Extend {
}
// 这里演示一下认为是工具类,但是java8已经提供了的方法,出现在这里的都【不用封装为工具类】
public static class NonExtend {
// LocalDateTime: 日期的加减,设置日期
public void operate() {
LocalDateTime localDateTime = systemLocalDateTime();
// 加3天
LocalDateTime plusDays = localDateTime.plusDays(3);
// 减4小时
LocalDateTime minusHours = localDateTime.minusHours(4);
// 设置为3小时
localDateTime.withHour(3);
// 通过TemporalAdjuster对象可以设置
// localDateTime.with(TemporalAdjuster);
}
// TemporalAdjusters: 任意时间设置,其中TemporalAdjuster是可以扩展的,可扩展属于专用,也不用扩展
public void operate2() {
LocalDate date = LocalDate.parse("2017-08-15");
// 获取这个月的第一个周末的时间
System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.SUNDAY)));// 2017-08-06
// 获取上个月的最后一周
System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(0, DayOfWeek.SUNDAY)));// 2017-07-30
// 获取这个月的倒数第一个周末的时间
System.out.println(date.with(TemporalAdjusters.dayOfWeekInMonth(-1, DayOfWeek.SUNDAY)));// 2017-08-27
// 获取这个月的第一个周末的时间,上面的dayOfWeekInMonth更灵活,可以定义第几周
System.out.println(date.with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY)));// 2017-08-06
// 其底层调用的是
// return TemporalAdjusters.dayOfWeekInMonth(1, dayOfWeek);
// 明年的第一天
System.out.println(date.with(TemporalAdjusters.firstDayOfNextYear()));// 2018-01-01
// 获取下周5的时间
System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)));// 2017-08-18
System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)));// 2017-08-22,始终返回下周的某个时间
// 获取周2时间
System.out.println(date.with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY)));// 2017-08-15,如果当前时间刚好是星期三,那么就返回当前时间
// 获取本月最后一天
System.out.println(date.with(TemporalAdjusters.lastDayOfMonth()));// 2017-08-31
}
// LocalDateTime:解析具体的某一天等
public void get() {
LocalDateTime localDateTime = systemLocalDateTime();
int year = localDateTime.getYear();
int month = localDateTime.getMonthValue();
int day = localDateTime.getDayOfMonth();
int minute = localDateTime.getMinute();
int second = localDateTime.get(ChronoField.SECOND_OF_MINUTE);
}
// LocalDate: 一个月天数,是否是瑞年
public void judge() {
LocalDateTime localDateTime = systemLocalDateTime();
LocalDate localDate = toLocalDate(localDateTime);
int lengthOfMonth = localDate.lengthOfMonth();
int lengthOfYear = localDate.lengthOfYear();
boolean leapYear = localDate.isLeapYear();
}
}
}
基于java 8 的时间工具类封装
最新推荐文章于 2024-05-22 10:49:11 发布