工具类:日期处理转换
日常工作中,我们会经常用做日期的格式化、日期与字符串之间的转换、日期之间的计算等。为了聚焦项目本身而不要过分关注其他细枝末节,本人写了一个开发中可能会用到的日期工具类。这个工具类里主要包含有“将日期字符串转换为Date日期”、“将Date日期转换为字符串形式”、“获取日期区间段内的每日日期”、“两个日期的时间戳之差”等这几个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; public class DateTimeUtils { /** * 将日期字符串转换为日期对象 * * @param dateStr 日期字符串,如“2018-10-08” * @param dateFormate 日期格式化字符串,如“yyyy-MM-dd" * @return 日期对象 * @see [类、类#方法、类#成员] * @Description: TODO */ public static Date parseDate(String dateText, String dateFormate) { if (dateText== null || dateText.trim().isEmpty()) return null ; SimpleDateFormat sdf = new SimpleDateFormat(dateFormate); Date date = null ; try { date = sdf.parse(dateText); } catch (ParseException e) { e.printStackTrace(); } return date; } /** * 获得某日期区间的每日日期集合 * * @param startDate 起始日期 * @param endDate 结束日期 * @return 日期集合 * @see [类、类#方法、类#成员] */ public static List<Date> getDatePeriodList(Date startDate, Date endDate) { List<Date> listDate = new ArrayList<Date>(); // 将起始日期加入日期列表 listDate.add(startDate); // 循环中会用到起止日期之间的日历对象 Calendar calCurrentDate = Calendar.getInstance(); // 将其初始值设置为起始日期 calCurrentDate.setTime(startDate); while (endDate.after(calCurrentDate.getTime())) { // 每次循环中,日历对象calCurrentDate向推进1天,并将其转换后的Date对象添加到listDate列表中 calCurrentDate.add(Calendar.DAY_OF_MONTH, 1 ); listDate.add(calCurrentDate.getTime()); } return listDate; } /** * 获得某日期区间的字符串型每日日期集合 * <br> * 如2018-10-01、2018-10-02、...2018-10-21 * * @param startDate 起始日期 * @param endDate 结束日期 * @param dateFormat 日期格式化字符串,如“yyyy-MM-dd" * @return 字符串型日期集合 * @see [类、类#方法、类#成员] * @Description: TODO */ public static List<String> datePeriodText(Date startDate, Date endDate, String dateFormat) { List<String> dateStrs = new ArrayList<>(); // 将起始日期加入日期列表 String startDateStr = dateToTextFormat(startDate, dateFormat); dateStrs.add(startDateStr); // 循环中会用到起止日期之间的日历对象 Calendar calCurrentDate = Calendar.getInstance(); // 将其初始值设置为起始日期 calCurrentDate.setTime(startDate); while (endDate.after(calCurrentDate.getTime())) { // 每次循环中,日历对象calCurrentDate向推进1天,并将其转换后的Date对象添加到listDate列表中 calCurrentDate.add(Calendar.DAY_OF_MONTH, 1 ); String curDateStr = dateToTextFormat(calCurrentDate.getTime(), dateFormat); dateStrs.add(curDateStr); } return dateStrs; } /** * 将日期对象转换为字符串形式 * * @param date 日期 * @param dateFormate 日期格式化字符串,如“yyyy-MM-dd" * @return 字符串格式的日期 * @see [类、类#方法、类#成员] * @Description: TODO */ public static String dateToTextFormat(Date date, String dateFormat) { return new SimpleDateFormat(dateFormat).format(date); } /** * 比较两个字符串格式的日期dateA 、dateB的先后时间顺序 * <p> * 返回值为1表示dateA时间在dateB之后, 返回值为-1表示dateA时间在dateB之前, 返回值为0表示dateA、dateB时间相同, * * @param dateA 日期1,如"08:10" * @param dateB 日期2,如"08:21" * @param dateFormate 日期格式化字符串 ,如"hh:mm"(12小时制)、“HH:mm"(24小时制) * @return 有-1,0,1这三个返回值 * @see [类、类#方法、类#成员] * @Description: TODO */ public static int compareTo(String dateA, String dateB, String dateFormate) { Date date1 = parseDate(dateA, dateFormate); Date date2 = parseDate(dateB, dateFormate); // date1在date2之后 if (date1.getTime() > date2.getTime()) { return 1 ; } // date1 在date2之前 else if (date1.getTime() < date2.getTime()) { return - 1 ; } // date1 、date2时间相同 else { return 0 ; } } /** * 计算两个字符串格式的日期dateA 、dateB的时间戳之差 * * @param dateA 日期A,如"08:10" 、"2018-03-10 12:12" * @param dateB 日期B,如"08:21"、 "2018-03-15 14:12" * @param dateFormate 日期格式化字符串 ,如"hh:mm"(12小时制)、“HH:mm"(24小时制) 、 "yyyy-MM-dd HH:mm" * @return 两日期之差的毫秒数 * @see [类、类#方法、类#成员] */ public static long diff(String dateA,String dateB,String dateFormate){ Date date1 = parseDate(dateA, dateFormate); Date date2 = parseDate(dateB, dateFormate); return date1.getTime()-date2.getTime(); } /** * 计算两个日期相差的小时数 * @param newDate * @param oldDate * @return * @see [类、类#方法、类#成员] */ public static long calcTimeDiffOnHour(Date newDate ,Date oldDate){ if (newDate== null || oldDate == null ){ throw new IllegalArgumentException( "参数 newDate 、oldDate不能为空" ); } long diffMillis= newDate.getTime()-oldDate.getTime(); return diffMillis/( 1000 * 60 * 60 ); } public static void main(String[] args) { long t=calcTimeDiffOnHour( new Date(), new Date( 119 , 7 , 24 )); System.out.println(t); System.out.println( new Date( 119 , 7 , 24 )+ " " + new Date()); } } |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· 万字长文详解Text-to-SQL
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!