java日期工具类2
发布日期:2021-06-30 16:29:03
浏览次数:4
分类:技术文章
本文共 20427 字,大约阅读时间需要 68 分钟。
java日期工具类
import java.text.ParsePosition;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;public class DateUtil { public enum DateStyle { YYYY_MM("yyyy-MM", false), YYYY_MM_DD("yyyy-MM-dd", false), YYYY_MM_DD_HH_MM("yyyy-MM-dd HH:mm", false), YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss", false), YYYY_MM_DDHH_MM_SS("yyyy-MM-ddHH:mm:ss", false), YYYY_MM_EN("yyyy/MM", false), YYYY_MM_DD_EN("yyyy/MM/dd", false), YYYY_MM_DD_HH_MM_EN("yyyy/MM/dd HH:mm", false), YYYY_MM_DD_HH_MM_SS_EN("yyyy/MM/dd HH:mm:ss", false), YYYY_MM_CN("yyyy年MM月", false), YYYY_MM_DD_CN("yyyy年MM月dd日", false), YYYY_MM_DD_HH_MM_CN("yyyy年MM月dd日 HH:mm", false), YYYY_MM_DD_HH_MM_SS_CN("yyyy年MM月dd日 HH:mm:ss", false), HH_MM("HH:mm", true), HH_MM_SS("HH:mm:ss", true), MM_DD("MM-dd", true), MM_DD_HH_MM("MM-dd HH:mm", true), MM_DD_HH_MM_SS("MM-dd HH:mm:ss", true), MM_DD_EN("MM/dd", true), MM_DD_HH_MM_EN("MM/dd HH:mm", true), MM_DD_HH_MM_SS_EN("MM/dd HH:mm:ss", true), MM_DD_CN("MM月dd日", true), MM_DD_HH_MM_CN("MM月dd日 HH:mm", true), MM_DD_HH_MM_SS_CN("MM月dd日 HH:mm:ss", true); private String value; private boolean isShowOnly; DateStyle(String value, boolean isShowOnly) { this.value = value; this.isShowOnly = isShowOnly; } public String getValue() { return value; } public boolean isShowOnly() { return isShowOnly; } } public enum Week { MONDAY("星期一", "Monday", "Mon.", 1), TUESDAY("星期二", "Tuesday", "Tues.", 2), WEDNESDAY("星期三", "Wednesday", "Wed.", 3), THURSDAY("星期四", "Thursday", "Thur.", 4), FRIDAY("星期五", "Friday", "Fri.", 5), SATURDAY("星期六", "Saturday", "Sat.", 6), SUNDAY("星期日", "Sunday", "Sun.", 7); String name_cn; String name_en; String name_enShort; int number; Week(String name_cn, String name_en, String name_enShort, int number) { this.name_cn = name_cn; this.name_en = name_en; this.name_enShort = name_enShort; this.number = number; } public String getChineseName() { return name_cn; } public String getName() { return name_en; } public String getShortName() { return name_enShort; } public int getNumber() { return number; } } private static final ThreadLocal < SimpleDateFormat > threadLocal = new ThreadLocal < SimpleDateFormat > (); private static final Object object = new Object(); /** * 获取SimpleDateFormat * @param pattern 日期格式 * @return SimpleDateFormat对象 * @throws RuntimeException 异常:非法日期格式 */ private static SimpleDateFormat getDateFormat(String pattern) throws RuntimeException { SimpleDateFormat dateFormat = threadLocal.get(); if (dateFormat == null) { synchronized(object) { if (dateFormat == null) { dateFormat = new SimpleDateFormat(pattern); dateFormat.setLenient(false); threadLocal.set(dateFormat); } } } dateFormat.applyPattern(pattern); return dateFormat; } /** * 获取日期中的某数值。如获取月份 * @param date 日期 * @param dateType 日期格式 * @return 数值 */ private static int getInteger(Date date, int dateType) { int num = 0; Calendar calendar = Calendar.getInstance(); if (date != null) { calendar.setTime(date); num = calendar.get(dateType); } return num; } /** * 增加日期中某类型的某数值。如增加日期 * @param date 日期字符串 * @param dateType 类型 * @param amount 数值 * @return 计算后日期字符串 */ private static String addInteger(String date, int dateType, int amount) { String dateString = null; DateStyle dateStyle = getDateStyle(date); if (dateStyle != null) { Date myDate = StringToDate(date, dateStyle); myDate = addInteger(myDate, dateType, amount); dateString = DateToString(myDate, dateStyle); } return dateString; } /** * 增加日期中某类型的某数值。如增加日期 * @param date 日期 * @param dateType 类型 * @param amount 数值 * @return 计算后日期 */ private static Date addInteger(Date date, int dateType, int amount) { Date myDate = null; if (date != null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(dateType, amount); myDate = calendar.getTime(); } return myDate; } /** * 获取精确的日期 * @param timestamps 时间long集合 * @return 日期 */ private static Date getAccurateDate(List < Long > timestamps) { Date date = null; long timestamp = 0; Map < Long, long[] > map = new HashMap < Long, long[] > (); List < Long > absoluteValues = new ArrayList < Long > (); if (timestamps != null && timestamps.size() > 0) { if (timestamps.size() > 1) { for (int i = 0; i < timestamps.size(); i++) { for (int j = i + 1; j < timestamps.size(); j++) { long absoluteValue = Math.abs(timestamps.get(i) - timestamps.get(j)); absoluteValues.add(absoluteValue); long[] timestampTmp = { timestamps.get(i), timestamps.get(j) }; map.put(absoluteValue, timestampTmp); } } // 有可能有相等的情况。如2012-11和2012-11-01。时间戳是相等的。此时minAbsoluteValue为0 // 因此不能将minAbsoluteValue取默认值0 long minAbsoluteValue = -1; if (!absoluteValues.isEmpty()) { minAbsoluteValue = absoluteValues.get(0); for (int i = 1; i < absoluteValues.size(); i++) { if (minAbsoluteValue > absoluteValues.get(i)) { minAbsoluteValue = absoluteValues.get(i); } } } if (minAbsoluteValue != -1) { long[] timestampsLastTmp = map.get(minAbsoluteValue); long dateOne = timestampsLastTmp[0]; long dateTwo = timestampsLastTmp[1]; if (absoluteValues.size() > 1) { timestamp = Math.abs(dateOne) > Math.abs(dateTwo) ? dateOne : dateTwo; } } } else { timestamp = timestamps.get(0); } } if (timestamp != 0) { date = new Date(timestamp); } return date; } /** * 判断字符串是否为日期字符串 * @param date 日期字符串 * @return true or false */ public static boolean isDate(String date) { boolean isDate = false; if (date != null) { if (getDateStyle(date) != null) { isDate = true; } } return isDate; } /** * 获取日期字符串的日期风格。失敗返回null。 * @param date 日期字符串 * @return 日期风格 */ public static DateStyle getDateStyle(String date) { DateStyle dateStyle = null; Map < Long, DateStyle > map = new HashMap < Long, DateStyle > (); List < Long > timestamps = new ArrayList < Long > (); for (DateStyle style: DateStyle.values()) { if (style.isShowOnly()) { continue; } Date dateTmp = null; if (date != null) { try { ParsePosition pos = new ParsePosition(0); dateTmp = getDateFormat(style.getValue()).parse(date, pos); if (pos.getIndex() != date.length()) { dateTmp = null; } } catch (Exception e) {} } if (dateTmp != null) { timestamps.add(dateTmp.getTime()); map.put(dateTmp.getTime(), style); } } Date accurateDate = getAccurateDate(timestamps); if (accurateDate != null) { dateStyle = map.get(accurateDate.getTime()); } return dateStyle; } /** * 将日期字符串转化为日期。失败返回null。 * @param date 日期字符串 * @return 日期 */ public static Date StringToDate(String date) { DateStyle dateStyle = getDateStyle(date); return StringToDate(date, dateStyle); } /** * 将日期字符串转化为日期。失败返回null。 * @param date 日期字符串 * @param pattern 日期格式 * @return 日期 */ public static Date StringToDate(String date, String pattern) { Date myDate = null; if (date != null) { try { myDate = getDateFormat(pattern).parse(date); } catch (Exception e) {} } return myDate; } /** * 将日期字符串转化为日期。失败返回null。 * @param date 日期字符串 * @param dateStyle 日期风格 * @return 日期 */ public static Date StringToDate(String date, DateStyle dateStyle) { Date myDate = null; if (dateStyle != null) { myDate = StringToDate(date, dateStyle.getValue()); } return myDate; } /** * 将日期转化为日期字符串。失败返回null。 * @param date 日期 * @param pattern 日期格式 * @return 日期字符串 */ public static String DateToString(Date date, String pattern) { String dateString = null; if (date != null) { try { dateString = getDateFormat(pattern).format(date); } catch (Exception e) {} } return dateString; } /** * 将日期转化为日期字符串。失败返回null。 * @param date 日期 * @param dateStyle 日期风格 * @return 日期字符串 */ public static String DateToString(Date date, DateStyle dateStyle) { String dateString = null; if (dateStyle != null) { dateString = DateToString(date, dateStyle.getValue()); } return dateString; } /** * 将日期字符串转化为另一日期字符串。失败返回null。 * @param date 旧日期字符串 * @param newPattern 新日期格式 * @return 新日期字符串 */ public static String StringToString(String date, String newPattern) { DateStyle oldDateStyle = getDateStyle(date); return StringToString(date, oldDateStyle, newPattern); } /** * 将日期字符串转化为另一日期字符串。失败返回null。 * @param date 旧日期字符串 * @param newDateStyle 新日期风格 * @return 新日期字符串 */ public static String StringToString(String date, DateStyle newDateStyle) { DateStyle oldDateStyle = getDateStyle(date); return StringToString(date, oldDateStyle, newDateStyle); } /** * 将日期字符串转化为另一日期字符串。失败返回null。 * @param date 旧日期字符串 * @param olddPattern 旧日期格式 * @param newPattern 新日期格式 * @return 新日期字符串 */ public static String StringToString(String date, String olddPattern, String newPattern) { return DateToString(StringToDate(date, olddPattern), newPattern); } /** * 将日期字符串转化为另一日期字符串。失败返回null。 * @param date 旧日期字符串 * @param olddDteStyle 旧日期风格 * @param newParttern 新日期格式 * @return 新日期字符串 */ public static String StringToString(String date, DateStyle olddDteStyle, String newParttern) { String dateString = null; if (olddDteStyle != null) { dateString = StringToString(date, olddDteStyle.getValue(), newParttern); } return dateString; } /** * 将日期字符串转化为另一日期字符串。失败返回null。 * @param date 旧日期字符串 * @param olddPattern 旧日期格式 * @param newDateStyle 新日期风格 * @return 新日期字符串 */ public static String StringToString(String date, String olddPattern, DateStyle newDateStyle) { String dateString = null; if (newDateStyle != null) { dateString = StringToString(date, olddPattern, newDateStyle.getValue()); } return dateString; } /** * 将日期字符串转化为另一日期字符串。失败返回null。 * @param date 旧日期字符串 * @param olddDteStyle 旧日期风格 * @param newDateStyle 新日期风格 * @return 新日期字符串 */ public static String StringToString(String date, DateStyle olddDteStyle, DateStyle newDateStyle) { String dateString = null; if (olddDteStyle != null && newDateStyle != null) { dateString = StringToString(date, olddDteStyle.getValue(), newDateStyle.getValue()); } return dateString; } /** * 增加日期的年份。失败返回null。 * @param date 日期 * @param yearAmount 增加数量。可为负数 * @return 增加年份后的日期字符串 */ public static String addYear(String date, int yearAmount) { return addInteger(date, Calendar.YEAR, yearAmount); } /** * 增加日期的年份。失败返回null。 * @param date 日期 * @param yearAmount 增加数量。可为负数 * @return 增加年份后的日期 */ public static Date addYear(Date date, int yearAmount) { return addInteger(date, Calendar.YEAR, yearAmount); } /** * 增加日期的月份。失败返回null。 * @param date 日期 * @param monthAmount 增加数量。可为负数 * @return 增加月份后的日期字符串 */ public static String addMonth(String date, int monthAmount) { return addInteger(date, Calendar.MONTH, monthAmount); } /** * 增加日期的月份。失败返回null。 * @param date 日期 * @param monthAmount 增加数量。可为负数 * @return 增加月份后的日期 */ public static Date addMonth(Date date, int monthAmount) { return addInteger(date, Calendar.MONTH, monthAmount); } /** * 增加日期的天数。失败返回null。 * @param date 日期字符串 * @param dayAmount 增加数量。可为负数 * @return 增加天数后的日期字符串 */ public static String addDay(String date, int dayAmount) { return addInteger(date, Calendar.DATE, dayAmount); } /** * 增加日期的天数。失败返回null。 * @param date 日期 * @param dayAmount 增加数量。可为负数 * @return 增加天数后的日期 */ public static Date addDay(Date date, int dayAmount) { return addInteger(date, Calendar.DATE, dayAmount); } /** * 增加日期的小时。失败返回null。 * @param date 日期字符串 * @param hourAmount 增加数量。可为负数 * @return 增加小时后的日期字符串 */ public static String addHour(String date, int hourAmount) { return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount); } /** * 增加日期的小时。失败返回null。 * @param date 日期 * @param hourAmount 增加数量。可为负数 * @return 增加小时后的日期 */ public static Date addHour(Date date, int hourAmount) { return addInteger(date, Calendar.HOUR_OF_DAY, hourAmount); } /** * 增加日期的分钟。失败返回null。 * @param date 日期字符串 * @param minuteAmount 增加数量。可为负数 * @return 增加分钟后的日期字符串 */ public static String addMinute(String date, int minuteAmount) { return addInteger(date, Calendar.MINUTE, minuteAmount); } /** * 增加日期的分钟。失败返回null。 * @param date 日期 * @param dayAmount 增加数量。可为负数 * @return 增加分钟后的日期 */ public static Date addMinute(Date date, int minuteAmount) { return addInteger(date, Calendar.MINUTE, minuteAmount); } /** * 增加日期的秒钟。失败返回null。 * @param date 日期字符串 * @param dayAmount 增加数量。可为负数 * @return 增加秒钟后的日期字符串 */ public static String addSecond(String date, int secondAmount) { return addInteger(date, Calendar.SECOND, secondAmount); } /** * 增加日期的秒钟。失败返回null。 * @param date 日期 * @param dayAmount 增加数量。可为负数 * @return 增加秒钟后的日期 */ public static Date addSecond(Date date, int secondAmount) { return addInteger(date, Calendar.SECOND, secondAmount); } /** * 获取日期的年份。失败返回0。 * @param date 日期字符串 * @return 年份 */ public static int getYear(String date) { return getYear(StringToDate(date)); } /** * 获取日期的年份。失败返回0。 * @param date 日期 * @return 年份 */ public static int getYear(Date date) { return getInteger(date, Calendar.YEAR); } /** * 获取日期的月份。失败返回0。 * @param date 日期字符串 * @return 月份 */ public static int getMonth(String date) { return getMonth(StringToDate(date)); } /** * 获取日期的月份。失败返回0。 * @param date 日期 * @return 月份 */ public static int getMonth(Date date) { return getInteger(date, Calendar.MONTH) + 1; } /** * 获取日期的天数。失败返回0。 * @param date 日期字符串 * @return 天 */ public static int getDay(String date) { return getDay(StringToDate(date)); } /** * 获取日期的天数。失败返回0。 * @param date 日期 * @return 天 */ public static int getDay(Date date) { return getInteger(date, Calendar.DATE); } /** * 获取日期的小时。失败返回0。 * @param date 日期字符串 * @return 小时 */ public static int getHour(String date) { return getHour(StringToDate(date)); } /** * 获取日期的小时。失败返回0。 * @param date 日期 * @return 小时 */ public static int getHour(Date date) { return getInteger(date, Calendar.HOUR_OF_DAY); } /** * 获取日期的分钟。失败返回0。 * @param date 日期字符串 * @return 分钟 */ public static int getMinute(String date) { return getMinute(StringToDate(date)); } /** * 获取日期的分钟。失败返回0。 * @param date 日期 * @return 分钟 */ public static int getMinute(Date date) { return getInteger(date, Calendar.MINUTE); } /** * 获取日期的秒钟。失败返回0。 * @param date 日期字符串 * @return 秒钟 */ public static int getSecond(String date) { return getSecond(StringToDate(date)); } /** * 获取日期的秒钟。失败返回0。 * @param date 日期 * @return 秒钟 */ public static int getSecond(Date date) { return getInteger(date, Calendar.SECOND); } /** * 获取日期 。默认yyyy-MM-dd格式。失败返回null。 * @param date 日期字符串 * @return 日期 */ public static String getDate(String date) { return StringToString(date, DateStyle.YYYY_MM_DD); } /** * 获取日期。默认yyyy-MM-dd格式。失败返回null。 * @param date 日期 * @return 日期 */ public static String getDate(Date date) { return DateToString(date, DateStyle.YYYY_MM_DD); } /** * 获取日期的时间。默认HH:mm:ss格式。失败返回null。 * @param date 日期字符串 * @return 时间 */ public static String getTime(String date) { return StringToString(date, DateStyle.HH_MM_SS); } /** * 获取日期的时间。默认HH:mm:ss格式。失败返回null。 * @param date 日期 * @return 时间 */ public static String getTime(Date date) { return DateToString(date, DateStyle.HH_MM_SS); } /** * 获取日期的星期。失败返回null。 * @param date 日期字符串 * @return 星期 */ public static Week getWeek(String date) { Week week = null; DateStyle dateStyle = getDateStyle(date); if (dateStyle != null) { Date myDate = StringToDate(date, dateStyle); week = getWeek(myDate); } return week; } /** * 获取日期的星期。失败返回null。 * @param date 日期 * @return 星期 */ public static Week getWeek(Date date) { Week week = null; Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int weekNumber = calendar.get(Calendar.DAY_OF_WEEK) - 1; switch (weekNumber) { case 0: week = Week.SUNDAY; break; case 1: week = Week.MONDAY; break; case 2: week = Week.TUESDAY; break; case 3: week = Week.WEDNESDAY; break; case 4: week = Week.THURSDAY; break; case 5: week = Week.FRIDAY; break; case 6: week = Week.SATURDAY; break; } return week; } /** * 获取两个日期相差的天数 * @param date 日期字符串 * @param otherDate 另一个日期字符串 * @return 相差天数。如果失败则返回-1 */ public static int getIntervalDays(String date, String otherDate) { return getIntervalDays(StringToDate(date), StringToDate(otherDate)); } /** * @param date 日期 * @param otherDate 另一个日期 * @return 相差天数。如果失败则返回-1 */ public static int getIntervalDays(Date date, Date otherDate) { int num = -1; Date dateTmp = DateUtil.StringToDate(DateUtil.getDate(date), DateStyle.YYYY_MM_DD); Date otherDateTmp = DateUtil.StringToDate(DateUtil.getDate(otherDate), DateStyle.YYYY_MM_DD); if (dateTmp != null && otherDateTmp != null) { long time = Math.abs(dateTmp.getTime() - otherDateTmp.getTime()); num = (int)(time / (24 * 60 * 60 * 1000)); } return num; }}
转载地址:https://kevin.blog.csdn.net/article/details/78730381 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月19日 13时27分38秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
CodeForces - 675A Infinite Sequence(简单数论 细节)
2019-04-30
CodeForces - 1042B Vitamins (思维)
2019-04-30
ACM 2013 长沙区域赛 Collision (几何)
2019-04-30
ACM 2014 鞍山区域赛 E - Hatsune Miku (dp)
2019-04-30
反向传播&梯度下降 的直观理解程序(numpy)
2019-04-30
CodeForces - 931B World Cup (思维 模拟)
2019-04-30
ACM 2017 北京区域赛 J-Pangu and Stones(区间dp)
2019-04-30
java常用类 String面试题
2019-04-30
Windows10下的powershell美化教程
2019-04-30
利用ffmpeg合并音频和视频
2019-04-30
select下拉框分组展示插件的使用--(select-mania插件的使用)
2019-04-30
Java Lambda表达式的应用--Stream API操作集合框架
2019-04-30
Myslq连接(JDBC)url属性的参数的设置
2019-04-30
关于Spring MVC与前端的交互
2019-04-30
大厂经典面试题:Redis为什么这么快?
2019-04-30
Android之Retrofit基本用法篇
2019-04-30