package com.nanjing.water.common.util; import cn.hutool.core.date.DateTime; import com.nanjing.water.common.ConstantFactory; import com.nanjing.water.common.exceptions.BusinessException; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.Date; /** * jdk8æ—¶é—´æ—¥æœŸå¤„ç† å·¥å…·ç±» */ public final class LocalDateTimeUtil { private LocalDateTimeUtil() { throw new IllegalStateException("Utility class"); } /** * é»˜è®¤æ—¶é—´æ ¼å¼åŒ–对象 */ private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern(ConstantFactory.STR_DATE_FULL); /** * é»˜è®¤æ—¶é—´æ ¼å¼åŒ–对象 */ private static final DateTimeFormatter DEFAULT_FORMATTER_DATE = DateTimeFormatter.ofPattern(ConstantFactory.STR_DATE); /** * 默认时间(1970-01-01 00:00:00) */ public static final LocalDateTime DEFAULT_DATETIME = LocalDateTime.parse(ConstantFactory.STR_DATE_DEFAULT, DEFAULT_FORMATTER); /** * 默认时间(1970-01-01) */ public static final LocalDate DEFAULT_DATE = LocalDate.parse(ConstantFactory.STR_DATE_DEFAULT_DATE, DEFAULT_FORMATTER_DATE); //************************************** ã€LocalDateTime】 ************************************** /** * 获å–当å‰LocalDateTime */ public static LocalDateTime nowDateTime() { return LocalDateTime.now(); } /** * 获å–当剿—¶é—´å—符串(yyyy-MM-dd HH:mm:ss) */ public static String nowDateTimeStr() { return LocalDateTimeUtil.toFormatString(LocalDateTime.now()); } /** * 获å–当剿—¶é—´å—符串(yyyy-MM-dd HH:mm:ss.SSS) */ public static String nowDateTimeFullStr() { return LocalDateTimeUtil.toFormatFullString(LocalDateTime.now()); } /** * 通过时间戳构建LocalDateTime * @param timestamp 时间戳 */ public static LocalDateTime getDateTime(Long timestamp) { if(NumericUtil.tryParseLong(timestamp).compareTo(0L)<1) { return LocalDateTimeUtil.DEFAULT_DATETIME; } return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()); } /** * 通过时间戳构建LocalDateTime * @param timestamp 时间戳 */ public static LocalDateTime getDateTime(Timestamp timestamp) { if(null==timestamp) { return LocalDateTimeUtil.DEFAULT_DATETIME; } return LocalDateTimeUtil.getDateTime(timestamp.getTime()); } /** * 通过时间å—ç¬¦ä¸²å’ŒæŒ‡å®šæ—¶é—´æ ¼å¼(例:yyyy-MM-dd HH:mm:ss), 构建LocalDateTime * @param dateTime æ—¶é—´å—符串 * @param format æŒ‡å®šæ—¶é—´æ ¼å¼(例:yyyy-MM-dd HH:mm:ss) */ public static LocalDateTime getDateTime(String dateTime, String format) { if(StringUtil.isNullOrEmpty(dateTime)) { return LocalDateTimeUtil.DEFAULT_DATETIME; } if(StringUtil.isNullOrEmpty(format)) { format = ConstantFactory.STR_DATE_FULL; } DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format); if(ConstantFactory.STR_DATE.equals(format)) { LocalDate localDate = getDate(dateTime); return localDate.atStartOfDay(); } return LocalDateTime.parse(dateTime, dateTimeFormatter); } /** * 通过时间å—ç¬¦ä¸²å’Œå›ºå®šæ—¶é—´æ ¼å¼(yyyy-MM-dd HH:mm:ss), 构建LocalDateTime * @param dateTime æ—¶é—´å—符串 */ public static LocalDateTime getDateTime(String dateTime) { return LocalDateTimeUtil.getDateTime(dateTime, ConstantFactory.STR_DATE_FULL); } /** * å°†LocalDateTimeæ ¼å¼åŒ–æˆæ—¶é—´å—符串 * @param dateTime LocalDateTime对象 * @param format æŒ‡å®šæ—¶é—´æ ¼å¼(例:yyyy-MM-dd HH:mm:ss) */ public static String toFormatString(LocalDateTime dateTime, String format) { if(null==dateTime) { return ConstantFactory.STR_DATE_DEFAULT; } if(StringUtil.isNullOrEmpty(format)) { format = ConstantFactory.STR_DATE_FULL; } DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format); return dateTimeFormatter.format(dateTime); } /** * å°†LocalDateTime按“yyyy-MM-dd HH:mm:ss.SSSâ€æ ¼å¼åŒ–æˆæ—¶é—´å—符串 * @param dateTime LocalDateTime对象 */ public static String toFormatFullString(LocalDateTime dateTime) { if(null==dateTime) { return ConstantFactory.STR_DATE_DEFAULT_FULL; } return LocalDateTimeUtil.toFormatString(dateTime, ConstantFactory.STR_DATE_FULLMS); } /** * å°†LocalDateTime按“yyyy-MM-dd HH:mm:ssâ€æ ¼å¼åŒ–æˆæ—¶é—´å—符串 * @param dateTime LocalDateTime对象 */ public static String toFormatString(LocalDateTime dateTime) { if(null==dateTime) { return ConstantFactory.STR_DATE_DEFAULT; } return LocalDateTimeUtil.toFormatString(dateTime, ConstantFactory.STR_DATE_FULL); } /** * å°†LocalDateTime按“yyyy-MM-ddâ€æ ¼å¼åŒ–æˆæ—¶é—´å—符串 * @param dateTime LocalDateTime对象 */ public static String toDateString(LocalDateTime dateTime) { if(null==dateTime) { return ConstantFactory.STR_DATE_DEFAULT_DATE; } return LocalDateTimeUtil.toFormatString(dateTime, ConstantFactory.STR_DATE); } /** * å°†dateTimeæ ¼å¼åŒ–æˆæ—¶é—´å—符串 * @param date LocalDate对象 * @param format æŒ‡å®šæ—¶é—´æ ¼å¼(例:yyyy-MM-dd) */ public static String toFormatString(LocalDate date, String format) { if(null==date) { return ConstantFactory.STR_DATE_DEFAULT_DATE; } if(StringUtil.isNullOrEmpty(format)) { format = ConstantFactory.STR_DATE; } DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format); return dateTimeFormatter.format(date); } /** * å°†LocalDate按“yyyy-MM-ddâ€æ ¼å¼åŒ–æˆæ—¶é—´å—符串 * @param date LocalDate对象 */ public static String toFormatString(LocalDate date) { return LocalDateTimeUtil.toFormatString(date, ConstantFactory.STR_DATE); } /** * LocalDateTimeå移指定月数 * @param dateTime LocalDateTime对象 * @param addMonth å移月数(å¯ä»¥ä¸ºè´Ÿæ•°) */ public static LocalDateTime dateTimeAddMonth(LocalDateTime dateTime, Long addMonth) { if(null==dateTime) { return LocalDateTimeUtil.DEFAULT_DATETIME; } return dateTime.plusMonths(addMonth); } /** * LocalDateTimeå移指定天数 * @param dateTime LocalDateTime对象 * @param addDay å移天数(å¯ä»¥ä¸ºè´Ÿæ•°) */ public static LocalDateTime dateTimeAddDay(LocalDateTime dateTime, Long addDay) { if(null==dateTime) { return LocalDateTimeUtil.DEFAULT_DATETIME; } return dateTime.plusDays(addDay); } /** * LocalDateTimeåç§»æŒ‡å®šå°æ—¶æ•° * @param dateTime LocalDateTime对象 * @param addHour åç§»å°æ—¶æ•°(å¯ä»¥ä¸ºè´Ÿæ•°) */ public static LocalDateTime dateTimeAddHour(LocalDateTime dateTime, Long addHour) { if(null==dateTime) { return LocalDateTimeUtil.DEFAULT_DATETIME; } return dateTime.plusHours(addHour); } /** * LocalDateTimeå移指定分钟数 * @param dateTime LocalDateTime对象 * @param addMin å移分钟数(å¯ä»¥ä¸ºè´Ÿæ•°) */ public static LocalDateTime dateTimeAddMin(LocalDateTime dateTime, Long addMin) { if(null==dateTime) { return LocalDateTimeUtil.DEFAULT_DATETIME; } return dateTime.plusMinutes(addMin); } /** * 获å–两个日期相差的天数 * * @param dateString1 开始日期的å—符串 * @param dateString2 ç»“æŸæ—¥æœŸçš„å—符串 * @return 相差天数,如果解æžå¤±è´¥åˆ™è¿”回-1 **/ public static long subDaysByDate2(String dateString1 , String dateString2 ) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate date1 = LocalDate.parse(dateString1, formatter); LocalDate date2 = LocalDate.parse(dateString2, formatter); long daysBetween = java.time.Duration.between(date1.atStartOfDay(), date2.atStartOfDay()).toDays(); return daysBetween; } /** * LocalDateTimeå移指定秒数 * @param dateTime LocalDateTime对象 * @param addSec å移秒数(å¯ä»¥ä¸ºè´Ÿæ•°) */ public static LocalDateTime dateTimeAddSec(LocalDateTime dateTime, Long addSec) { if(null==dateTime) { return LocalDateTimeUtil.DEFAULT_DATETIME; } return dateTime.plusSeconds(addSec); } /** * LocalDateTime指定时间部分,å移指定值 * @param dateTime LocalDateTime对象 * @param addPart å移时间部分 * @param value å移值 */ public static LocalDateTime dateTimeAdd(LocalDateTime dateTime, ChronoUnit addPart, Long value) { if(null==dateTime) { return LocalDateTimeUtil.DEFAULT_DATETIME; } return dateTime.plus(value, addPart); } /** * 获å–当剿œˆä»½ç¬¬ä¸€å¤©LocalDateTime“00:00:00†*/ public static LocalDateTime monthFirstDateTime() { LocalDateTime now = LocalDateTime.now(); return LocalDateTime.of(now.getYear(), now.getMonthValue(), 1, 0, 0); } /** * 获å–年月å—符串第一天“00:00:00â€æ—¶é—´æˆ³ */ public static Long getYearMonthFirstTime(String yearMonth){ //String month = "2023-05"; LocalDateTime time = DateTime.of(yearMonth, "yyyy-MM").toTimestamp().toLocalDateTime(); LocalDateTime first = time.with(TemporalAdjusters.firstDayOfMonth()).withHour(0) .withMinute(0).withSecond(0); return getTimeStamp(first).getTime(); } /** * 获å–年月å—符串最åŽä¸€å¤©â€œ00:00:00â€æ—¶é—´æˆ³ */ public static Long getYearMonthLatestTime(String yearMonth){ //String month = "2023-05"; LocalDateTime time = DateTime.of(yearMonth, "yyyy-MM").toTimestamp().toLocalDateTime(); LocalDateTime end = time.with(TemporalAdjusters.lastDayOfMonth()).withHour(23) .withMinute(59).withSecond(59); return getTimeStamp(end).getTime(); } /** * 获å–当剿œˆä»½æœ€åŽä¸€å¤©LocalDateTime“23:59:59†*/ public static LocalDateTime monthLatestDateTime() { //当剿œˆç¬¬ä¸€å¤©â€œ00:00:00†LocalDateTime monthFirst = monthFirstDateTime(); //下个月第一天“00:00:00†LocalDateTime nextMonthFirst = dateTimeAddMonth(monthFirst, 1L); //当剿œˆæœ€åŽä¸€å¤©â€œ23:59:59†return LocalDateTimeUtil.dateTimeAddSec(nextMonthFirst, -1L); } /** * 获å–今天LocalDateTime“00:00:00†*/ public static LocalDateTime todayFirst() { LocalDateTime now = LocalDateTimeUtil.nowDateTime(); return LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), 0, 0); } /** * 获å–今天LocalDateTime“23:59:59†*/ public static LocalDateTime todayLatest() { //今天“00:00:00†LocalDateTime now = LocalDateTimeUtil.nowDateTime(); //明天“00:00:00†LocalDateTime nextDayFirst = LocalDateTimeUtil.dateTimeAddDay(now, 1L); //今天“23:59:59†return LocalDateTimeUtil.dateTimeAddSec(nextDayFirst, -1L); } //************************************** ã€LocalDateTime】 ************************************** //************************************** ã€LocalDate】 ************************************** /** * 获å–当å‰LocalDate */ public static LocalDate nowDate() { return LocalDate.now(); } /** * 获å–当剿—¥æœŸå—符串(yyyy-MM-dd) */ public static String todayStr() { return LocalDateTimeUtil.toFormatString(LocalDateTime.now(), ConstantFactory.STR_DATE); } /** * æ ¹æ®æ—¥æœŸå—符串获å–LocalDate(必须是yyyy-MM-ddæ ¼å¼) * @param date 日期å—符串 */ public static LocalDate getDate(String date) { if(StringUtil.isNullOrEmpty(date)) { return LocalDateTimeUtil.DEFAULT_DATE; } return LocalDate.parse(date); } /** * 获å–LocalDate * @param year 年份 * @param month 月份 * @param day 天 */ public static LocalDate getDate(Integer year, Integer month, Integer day) { return LocalDate.of(year, month, day); } /** * LocalDateå移指定天数 * @param date LocalDate对象 * @param addDay å移天数(å¯ä»¥ä¸ºè´Ÿæ•°) */ public static LocalDate dateAddDay(LocalDate date, Long addDay) { if(null==date) { return LocalDateTimeUtil.DEFAULT_DATE; } return date.plusDays(addDay); } /** * LocalDateå移指定月数 * @param date LocalDate对象 * @param addMonth å移月数(å¯ä»¥ä¸ºè´Ÿæ•°) */ public static LocalDate dateAddMonth(LocalDate date, Long addMonth) { if(null==date) { return LocalDateTimeUtil.DEFAULT_DATE; } return date.plusMonths(addMonth); } /** * 获å–当剿œˆä»½ç¬¬ä¸€å¤©LocalDate */ public static LocalDate monthFirstDate() { LocalDate toDay = nowDate(); return LocalDate.of(toDay.getYear(), toDay.getMonthValue(), 1); } /** * 获å–当剿œˆä»½æœ€åŽä¸€å¤©LocalDate */ public static LocalDate monthLatestDate() { //当剿œˆç¬¬ä¸€å¤© LocalDate monthFirst = monthFirstDate(); //下个月第一天 LocalDate nextMonthDay = dateAddMonth(monthFirst, 1L); return LocalDateTimeUtil.dateAddDay(nextMonthDay, -1L); } //************************************** ã€LocalDate】 ************************************** //************************************** ã€æ—¶é—´æˆ³å¤„ç†ã€‘ ************************************** /** * 获å–当剿—¶é—´æˆ³ */ public static Long nowTimeStamp() { return Instant.now().toEpochMilli(); } /** * 获å–当剿—¶é—´æˆ³(å—符串) */ public static String nowTimeStampStr() { return String.valueOf(nowTimeStamp()); } /** * 通过LocalDateTimeå¯¹è±¡èŽ·å–æ—¶é—´æˆ³ * @param dateTime LocalDateTime对象 */ public static Timestamp getTimeStamp(LocalDateTime dateTime) { if(null==dateTime) { return Timestamp.valueOf(LocalDateTimeUtil.DEFAULT_DATETIME); } return Timestamp.valueOf(dateTime); } /** * 通过时间å—ç¬¦ä¸²æŒ‰æŒ‡å®šæ ¼å¼èŽ·å–æ—¶é—´æˆ³ * @param dateTime æ—¶é—´å—符串 * @param format æ—¶é—´æ ¼å¼ */ public static Timestamp getTimeStamp(String dateTime, String format) { LocalDateTime localDateTime = LocalDateTimeUtil.getDateTime(dateTime, format); return Timestamp.valueOf(localDateTime); } /** * 通过时间å—符串按“yyyy-MM-dd HH:mm:ssâ€æ ¼å¼èŽ·å–æ—¶é—´æˆ³ * @param dateTime æ—¶é—´å—符串 */ public static Timestamp getTimeStamp(String dateTime) { return LocalDateTimeUtil.getTimeStamp(dateTime, ConstantFactory.STR_DATE_FULL); } /** * 通过Unix时间戳获å–Timestamp * @param timeStamp Unix时间戳 */ public static Timestamp getTimeStamp(Long timeStamp) { return new Timestamp(timeStamp); } /** * é€šè¿‡æ—¶é—´æˆ³ï¼ŒæŒ‰æŒ‡å®šæ ¼å¼ï¼Œè½¬æˆæ—¶é—´å—符串 * @param timeStamp 时间戳值 * @param format æ—¶é—´æ ¼å¼ */ public static String toFormatString(Long timeStamp, String format) { LocalDateTime dateTime = LocalDateTimeUtil.getDateTime(timeStamp); return LocalDateTimeUtil.toFormatString(dateTime, format); } /** * 通过时间戳,按“yyyy-MM-dd HH:mm:ssâ€è½¬æˆæ—¶é—´å—符串 * @param timeStamp 时间戳值 */ public static String toFormatString(Long timeStamp) { return LocalDateTimeUtil.toFormatString(timeStamp, ConstantFactory.STR_DATE_FULL); } /** * 通过时间戳,按“yyyy-MM-ddâ€è½¬æˆæ—¶é—´å—符串 * @param timeStamp 时间戳值 */ public static String toDateString(Long timeStamp) { return LocalDateTimeUtil.toFormatString(timeStamp, ConstantFactory.STR_DATE); } /** * 通过时间戳,按“yyyy-MM-dd HH:mm:ss.SSSâ€è½¬æˆæ—¶é—´å—符串 * @param timeStamp 时间戳值 */ public static String toFormatFullString(Long timeStamp) { return LocalDateTimeUtil.toFormatString(timeStamp, ConstantFactory.STR_DATE_FULLMS); } /** * é€šè¿‡æ—¶é—´æˆ³ï¼ŒæŒ‰æŒ‡å®šæ ¼å¼ï¼Œè½¬æˆæ—¶é—´å—符串 * @param timeStamp 时间戳值 * @param format æ—¶é—´æ ¼å¼ */ public static String toFormatString(Timestamp timeStamp, String format) { LocalDateTime dateTime = LocalDateTimeUtil.getDateTime(timeStamp); return LocalDateTimeUtil.toFormatString(dateTime, format); } /** * 通过时间戳,按“yyyy-MM-dd HH:mm:ssâ€è½¬æˆæ—¶é—´å—符串 * @param timeStamp 时间戳值 */ public static String toFormatString(Timestamp timeStamp) { return LocalDateTimeUtil.toFormatString(timeStamp, ConstantFactory.STR_DATE_FULL); } /** * 通过时间戳,按“yyyy-MM-ddâ€è½¬æˆæ—¶é—´å—符串 * @param timeStamp 时间戳值 */ public static String toDateString(Timestamp timeStamp) { return LocalDateTimeUtil.toFormatString(timeStamp, ConstantFactory.STR_DATE); } /** * 通过时间戳,按“yyyy-MM-dd HH:mm:ss.SSSâ€è½¬æˆæ—¶é—´å—符串 * @param timeStamp 时间戳值 */ public static String toFormatFullString(Timestamp timeStamp) { return LocalDateTimeUtil.toFormatString(timeStamp, ConstantFactory.STR_DATE_FULLMS); } //************************************** ã€æ—¶é—´æˆ³å¤„ç†ã€‘ ************************************** public static String convertToDateFormat(String inputString) { try { // 将输入å—符串解æžä¸ºæ—¥æœŸå¯¹è±¡ SimpleDateFormat inputFormat = new SimpleDateFormat("yyMMddHHmmss"); Date date = inputFormat.parse(inputString); // å°†æ—¥æœŸå¯¹è±¡æ ¼å¼åŒ–ä¸ºç›®æ ‡æ—¥æœŸå—符串 SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return outputFormat.format(date); } catch (Exception e) { return "Invalid Date"; } } public static String nowTimeBCD(String timeFormat) { return LocalDateTimeUtil.time2BCD(LocalDateTimeUtil.nowDateTime(), timeFormat); } public static String nowTimeBCD() { return LocalDateTimeUtil.time2BCD(LocalDateTimeUtil.nowDateTime()); } public static String time2BCD(LocalDateTime nowDateTime) { String timeStr = LocalDateTimeUtil.toFormatString(nowDateTime, ConstantFactory.STR_DATE_FULL); return LocalDateTimeUtil.number2BCD(timeStr); } public static String time2BCD(LocalDateTime nowDateTime, String timeFormat) { String timeStr = LocalDateTimeUtil.toFormatString(nowDateTime, timeFormat); return LocalDateTimeUtil.number2BCD(timeStr); } public static String number2BCD(String numberStr) { // å› ä¸ºå¯èƒ½ä¿®æ”¹å—ç¬¦ä¸²çš„å†…å®¹ï¼Œæ‰€ä»¥æž„é€ StringBuffer StringBuffer sb = new StringBuffer(numberStr); // 一个å—节包å«ä¸¤ä¸ª4ä½çš„BCDç ,byte数组ä¸è¦åŒ…å«å¶æ•°ä¸ªBCDç // 一个å进制å—符对应4ä½BCDç ,所以如果å进制å—符串的长度是奇数,è¦åœ¨å‰é¢è¡¥ä¸€ä¸ª0使长度æˆä¸ºå¶æ•° if ((sb.length() % 2) != 0) { sb.insert(0, '0'); } // 两个å进制数å—转æ¢ä¸ºBCDç åŽå 用一个å—èŠ‚ï¼Œæ‰€ä»¥å˜æ”¾BCDç çš„å—节数ç‰äºŽå进制å—ç¬¦ä¸²é•¿åº¦çš„ä¸€åŠ byte[] bcd = new byte[sb.length() / 2]; for (int i = 0; i < sb.length();) { if (!Character.isDigit(sb.charAt(i)) || !Character.isDigit(sb.charAt(i + 1))) { throw new BusinessException("ä¼ å…¥çš„å进制å—符串包å«éžæ•°å—å—符!"); } // æ¯ä¸ªå—节的构æˆï¼šç”¨ä¸¤ä½å进制数å—è¿ç®—的和填充,高ä½å进制数å—左移4ä½+低ä½åè¿›åˆ¶æ•°å— bcd[i/2] = (byte)((Character.digit(sb.charAt(i), 10) << 4) + Character.digit(sb.charAt(i + 1), 10)); // å—符串的æ¯ä¸¤ä¸ªå—符å–出æ¥ä¸€èµ·å¤„ç†ï¼Œæ‰€ä»¥æ¤å¤„i的自增长è¦åŠ 2ï¼Œè€Œä¸æ˜¯åŠ 1 i += 2; } StringBuffer sbResult = new StringBuffer(); for (int i = 0; i < bcd.length; i++) { sbResult.append(Integer.toBinaryString(bcd[i])); } return sbResult.toString(); } }