From 385edaf9e2258bd3ccaa0b9d30fd9f58b19b5362 Mon Sep 17 00:00:00 2001 From: ehlxr Date: Wed, 9 Dec 2020 16:52:11 +0800 Subject: [PATCH] add dateutil --- resources/.DS_Store | Bin 10244 -> 0 bytes src/main/java/me/ehlxr/utils/DateUtil.java | 277 +++++++++++++++++++++ 2 files changed, 277 insertions(+) delete mode 100644 resources/.DS_Store create mode 100644 src/main/java/me/ehlxr/utils/DateUtil.java diff --git a/resources/.DS_Store b/resources/.DS_Store deleted file mode 100644 index 4212105c4472780b5a4fbfc7ee0f04862cf44e74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHMTWB0r82Pr6zP)}`lN_2f>)%X6^Uq(B8V?OiTEPo?LX(thRvpV6D>F=%=ypd z|IX!`Z}#V$004Gn^;Uo=04VfutCmxCgT(v!vmk~1mP)cncz_IS0v8PM=r2eC0|5g8 z0|5g80|5g!BLft(c~Z)x4f242fPsL4IR^OeLzEtFW4@h{R{V5OCXN7POQ=~SD$_YY zV4}W_`F2KH0i`kJ=>dHx`bP|uaO#h8cd{|x&PXfafD#Vq&y4;F1;y-yiwbwZn6yD2 zFc2`XkO6*nuZAR~K&Nwi;rZPJ8%CiSCaBNqwVY(aauVdtKd_zjH2x(Ll>o{Jn*<9? zNQ?7-Gu6{DQiOW72*t>2j8GFaZ!>6AJ~JPIHARSWT9HBP;w#nYj=>Sg`@t>3oiD;I zC!9(CDS`HAwge#^$cfeR*%yxSOVJoB7L36e8=-Y%X%BqNB#l)&`5k_f-yvgV;okiR4i2ko)-~=kEX^~=jULT2++nrKrLFcR9s6*`7^iIw zCLJrAvZ<#!saeS^IUAjp6*tcr?vQ6pc)WDXbuwPJa2zrT%iD(4g9|bBT8(~95Ic|K+e>?v7?%sG;H0pM+e7E*GyPO zzpbT=YW#t**^1RQYie%|hZl1l$|lUSS<{lI~It*okGb>X#4eM>o^)9U*iozJ9; zo^V~bK~awL_U?>9xol>Q;SEgHlzx|XB8S+-HZ#>_{b%TXN@yF~s;D{}u(X6>$)*mr zT~QCP!Ew1=*|>}CR;say4JDmaiuUQs=FV`pqJE;B;&UI=T<=iYuxWa}yFGQ`@KN60 zsq2PLlB|z4$`>tYsE@VCn#x0bEi}Py*bB$#W3lP;dmNsCC*cBIg3ItGybB-0r|>yk zg)iV5d`MWa!k5f|ObAT^Ef+R4yG^y`zDuAyT)j-nk*d)Fq@{CY+l$vxvHs zWGZ{NY-LO>Asx%!ZQH4L87Wqot*u$Jn(byW#y>I@1h}h##zKWHroTni_X@lQ@4!cJ zg;e(yT!-)BC-{{VSAvzen)DXN+c1Lbu@N`mMr^`%>>%asAno0;2;j+ zQB0st>Knx|JWJ}!;yC7T1|JeCd<35&6+VN{;&Y_KOGT>d&Ff8Ce4|ixE zag~-r9|fKy^ur_tT4R1N5#jlTg7Cb80+S3o2}1E8&x4jn0apf4m&%h1f;0 zoKOi7<|&ZQpHqbDLT>^GDPSOAAYdS1AYdS1;O1jsiCj{Y-~aDf{Qv(q-@=0x1q=iX z{9_DYNl(0|i-yaee~U-vckNMnPSe8^_nVPcKqwQ}@npqyJXQF0ytoFSHva-Z;9}Iy b@iWp=iPFFR&w$|kUvP;Ood5ri=l{O}Vbb*! diff --git a/src/main/java/me/ehlxr/utils/DateUtil.java b/src/main/java/me/ehlxr/utils/DateUtil.java new file mode 100644 index 0000000..6ebfe42 --- /dev/null +++ b/src/main/java/me/ehlxr/utils/DateUtil.java @@ -0,0 +1,277 @@ +package me.ehlxr.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.Calendar; +import java.util.Date; + +/** + * 时间工具类 + * + * @author ehlxr + * @since 2020-12-09 16:51. + */ +public class DateUtil { + public static final DateTimeFormatter FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static final DateTimeFormatter FORMAT_1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"); + public static final DateTimeFormatter FORMAT_2 = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + public static final DateTimeFormatter FORMAT_3 = DateTimeFormatter.ofPattern("yyyyMMdd"); + public static final DateTimeFormatter FORMAT_4 = DateTimeFormatter.ofPattern("yyyy-MM"); + /** + * "Asia/Shanghai" + */ + private static final ZoneId ZONE_ID = ZoneId.of(ZoneId.SHORT_IDS.get("CTT")); + + private DateUtil() { + } + + /** + * 获取当前日期时间 + * + * @return 当前日期时间 {@link LocalDateTime} + */ + public static LocalDateTime currentDateTime() { + return LocalDateTime.now(ZONE_ID); + } + + /** + * 获取当前日期时间字符串 + * + * @return "yyyy-MM-dd HH:mm:ss" 格式字符串 + */ + public static String currentDateTimeStr() { + return LocalDateTime.now(ZONE_ID).format(FORMAT); + } + + /** + * 获取当前日期字符串 + * + * @return "yyyy-MM-dd" 格式字符串 + */ + public static String currentDateStr() { + return LocalDate.now(ZONE_ID).toString(); + } + + /** + * 计算当前时间以前几个月的时间 + * + * @param amount 月份 + * @return "yyyy-MM-dd HH:mm:ss" 格式字符串 + */ + public static String pastMonthsDateTime(long amount) { + return LocalDateTime.now(ZONE_ID).minus(amount, ChronoUnit.MONTHS).format(FORMAT); + } + + /** + * 计算当前时间以前几个月的时间 + * + * @param amount 月份 + * @return "yyyy-MM-dd" 格式字符串 + */ + public static String pastMonthsDate(long amount) { + return LocalDate.now(ZONE_ID).minus(amount, ChronoUnit.MONTHS).toString(); + } + + /** + * 计算指定时间(yyyy-MM-dd HH:mm:ss 格式字符串)以前几个月的时间 + * + * @param amount 月份 + * @return "yyyy-MM-dd HH:mm:ss" 格式字符串 + */ + public static String pastMonthsDate(String localDateTime, long amount) { + return LocalDateTime.parse(localDateTime, FORMAT).minus(amount, ChronoUnit.MONTHS).format(FORMAT); + } + + /** + * 指定日期格式化,带星期 + */ + public static String asStringWithWeek(String date) { + LocalDateTime localDateTime = LocalDateTime.parse(date, FORMAT); + String[] weekDays = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"}; + int w = localDateTime.getDayOfWeek().getValue() - 1; + return localDateTime.format(FORMAT) + " " + weekDays[w]; + } + + /** + * LocalDate 转 Date + * + * @param localDate 要转换的 {@link LocalDate} + * @return {@link Date} + */ + public static Date asDate(LocalDate localDate) { + return Date.from(localDate.atStartOfDay().atZone(ZONE_ID).toInstant()); + } + + /** + * LocalDateTime 转 Date + * + * @param localDateTime 要转换的 {@link LocalDateTime} + * @return {@link Date} + */ + public static Date asDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZONE_ID).toInstant()); + } + + /** + * Date 转 LocalDate + * + * @param date 要转换的 {@link Date} + * @return {@link LocalDate} + */ + public static LocalDate asLocalDate(Date date) { + return date.toInstant().atZone(ZONE_ID).toLocalDate(); + // return Instant.ofEpochMilli(date.getTime()).atZone(ZONE_ID).toLocalDate(); + } + + /** + * Date 转 LocalDateTime + * + * @param date 要转换的 {@link Date} + * @return {@link LocalDateTime} + */ + public static LocalDateTime asLocalDateTime(Date date) { + return LocalDateTime.ofInstant(date.toInstant(), ZONE_ID); + // return date.toInstant().atZone(ZONE_ID).toLocalDateTime(); + // return Instant.ofEpochMilli(date.getTime()).atZone(ZONE_ID).toLocalDateTime(); + } + + /** + * 日期字符串转 LocalDateTime + * + * @param date 要转换的 yyyy-MM-dd HH:mm:ss 类型字符串 + * @return {@link LocalDateTime} + */ + public static LocalDateTime asLocalDateTime(String date) { + return asLocalDateTime(date, FORMAT); + } + + /** + * 日期字符串转 LocalDateTime + * + * @param date 要转换的字符串 + * @param pattern 模式字符串,例如:yyyy-MM-dd HH:mm:ss + * @return {@link LocalDateTime} + */ + public static LocalDateTime asLocalDateTime(String date, String pattern) { + return asLocalDateTime(date, DateTimeFormatter.ofPattern(pattern)); + } + + private static LocalDateTime asLocalDateTime(String date, DateTimeFormatter formatter) { + return LocalDateTime.parse(date, formatter); + } + + public static Date parse(String strDate) throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + return sdf.parse(strDate); + } + + + /** + * 出生日期换年龄 + * + * @param birthDay + * @return + */ + public static int getAge(Date birthDay) { + Calendar cal = Calendar.getInstance(); + //出生日期晚于当前时间,无法计算 + if (cal.before(birthDay)) { + throw new IllegalArgumentException("The birthDay is before Now.It's unbelievable!"); + } + //当前年份 + int yearNow = cal.get(Calendar.YEAR); + //当前月份 + int monthNow = cal.get(Calendar.MONTH); + //当前日期 + int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); + cal.setTime(birthDay); + int yearBirth = cal.get(Calendar.YEAR); + int monthBirth = cal.get(Calendar.MONTH); + int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); + //计算整岁数 + int age = yearNow - yearBirth; + if (monthNow <= monthBirth) { + if (monthNow == monthBirth) { + //当前日期在生日之前,年龄减一 + if (dayOfMonthNow < dayOfMonthBirth) { + age--; + } + } else { + //当前月份在生日之前,年龄减一 + age--; + } + } + return age; + } + + public static Integer getDifMonth(Date startDate, Date endDate) { + Calendar start = Calendar.getInstance(); + Calendar end = Calendar.getInstance(); + start.setTime(startDate); + end.setTime(endDate); + int result = end.get(Calendar.MONTH) - start.get(Calendar.MONTH); + int month = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * 12; + return Math.abs(month + result); + } + + public static void main(String[] args) { + try { + System.out.println(getDifMonth(DateUtil.parse("2020-11-02 15:43:37"), DateUtil.parse("2020-10-01 15:43:37"))); + } catch (ParseException e) { + e.printStackTrace(); + } + + System.out.println(asStringWithWeek(currentDateTimeStr())); + System.out.println("DateUtil.currentDateTime():" + DateUtil.currentDateTimeStr()); + System.out.println("DateUtil.currentDate():" + DateUtil.currentDateStr()); + System.out.println("DateUtil.passMonthsDateTime(3):" + DateUtil.pastMonthsDateTime(3)); + System.out.println("DateUtil.passMonthsDate(3):" + DateUtil.pastMonthsDate(3)); + + // DateTimeFormatter t = new DateTimeFormatterBuilder() + // .parseCaseInsensitive() + // .append(ISO_LOCAL_DATE) + // .appendLiteral(' ') + // .append(new DateTimeFormatterBuilder() + // .appendValue(HOUR_OF_DAY, 2) + // .appendLiteral(':') + // .appendValue(MINUTE_OF_HOUR, 2) + // .optionalStart() + // .appendLiteral(':') + // .appendValue(SECOND_OF_MINUTE, 2).toFormatter(Locale.CHINA)).toFormatter(Locale.CHINA); + // + // System.out.println(LocalDateTime.now().format(t)); + + + System.out.println("FORMAT Pattern(\"yyyy-MM-dd HH:mm:ss\"):"); + System.out.println("FORMAT_1 Pattern(\"yyyy-MM-dd HH:mm:ss.S\")"); + System.out.println("LocalDateTime.parse(\"2019-07-25 17:15:23.0\", FORMAT_1):" + LocalDateTime.parse("2019-07-25 17:15:23.0", FORMAT_1)); + System.out.println("passMonthsDate(\"2019-07-25 17:15:23\", 3):" + pastMonthsDate("2019-07-25 17:15:23", 3)); + System.out.println("LocalDateTime.parse(\"2019-07-25 17:15:23.0\", FORMAT_1).format(FORMAT):" + LocalDateTime.parse("2019-07-25 17:15:23.0", FORMAT_1).format(FORMAT)); + System.out.println("LocalDate.parse(\"2019-07-25 17:15:23.0\", FORMAT).toString():" + LocalDate.parse("2019-07-25 17:15:23.0", FORMAT_1).toString()); + + + // Set set = ZoneId.getAvailableZoneIds(); + // set.forEach(System.out::println); + + // createTime = "2019-07-25 17:15:23"; + // createTime = createTime.substring(0, 19); + // System.out.println(createTime); + + Date date = new Date(); + System.out.println("当前时间 Date:" + date); + System.out.println("当前时间 Date asLocalDate:" + DateUtil.asLocalDate(date)); + System.out.println("当前时间 Date asLocalDateTime:" + DateUtil.asLocalDateTime(date).format(FORMAT)); + + LocalDateTime localDateTime = DateUtil.currentDateTime(); + System.out.println("当前时间 localDateTime:" + localDateTime); + System.out.println("当前时间 LocalDateTime asDate:" + DateUtil.asDate(localDateTime)); + System.out.println("当前时间 LocalDate asDate:" + DateUtil.asDate(LocalDate.now())); + + System.out.println(ChronoUnit.YEARS.between(LocalDate.now(), LocalDate.parse("1991-08-30", FORMAT_2))); + } +} \ No newline at end of file