📋 目录
- 一、工具类功能
- 二、所需环境
- 三、方法与调用示例(按需调用)
- 四、工具类源码(可直接复制)
一、工具类功能
一个入口在Date、毫秒时间戳、字符串与LocalDate/LocalDateTime/Timestamp之间来回转,目标类型由调用方指定,专治「手里是 A 类型、接口要 B 类型」。
二、所需环境
JDK 17或以上
三、方法与调用示例(按需调用)
🔢方法序号:1
🎯方法用途:
- 把
Date、Timestamp、毫秒时间戳、时间字符串、LocalDate/LocalDateTime统一转成你指定的时间类型 - 一个入口替掉一串格式化器和
instanceof分支,专治「手里是 A 类型、接口要 B 类型」
🧩方法定义:public static <T> T convert(Object source, Class<T> targetType)
🗣️入参解释:public static <T> T convert(时间源, 目标类型)
📤返回值解释:T,与传入的目标类型同一个类型
💡边界口径:
- 时间源认
Date(含java.sql.Date、java.sql.Time)、Timestamp、Long毫秒、String、LocalDate、LocalDateTime,目标认String、LocalDate、LocalDateTime、Timestamp、Date、Long,范围外抛IllegalArgumentException并带上类型名 - 字符串按 ① ISO 日期时间(小数秒最多 9 位)②
yyyy-MM-dd③yyyy-MM-dd HH:mm:ss依次试,首尾空白先去 - 带时区偏移的串与空格分隔还带毫秒的串都不在支持范围,要带毫秒写成 ISO 形式
- 解析固定 STRICT,
2024-02-30与平年2023-02-29算解析失败,不会被夹成当月最后一天 - 换算按调用时刻的系统默认时区,不在类加载时固化,
TimeZone.setDefault立刻生效 - 夏令时空档里不存在的本地时间会被顺延一小时,重叠时刻取开始那个偏移、往返一致
- 转
Long与Date截到毫秒,只有LocalDateTime与Timestamp之间往返保留得住毫秒以下的位 source或targetType传null抛NullPointerException,类型不支持才抛IllegalArgumentException
🧪方法示例:
convert(new Date(1705285845000L), String.class)拿到2024-01-15 10:30:45,默认格式只到秒convert(new Date(1705285845000L), LocalDateTime.class)拿到2024-01-15T10:30:45convert(1705285845000L, LocalDateTime.class)拿到2024-01-15T10:30:45,毫秒时间戳直接进 java.timeconvert("2024-01-15 10:30:45", LocalDateTime.class)拿到2024-01-15T10:30:45convert("2024-01-15T10:30:45.123", LocalDateTime.class)拿到2024-01-15T10:30:45.123,要带毫秒得写成 ISO 的 T 形式convert("2024-01-15", LocalDate.class)拿到2024-01-15convert(" 2024-01-15 ", LocalDate.class)拿到2024-01-15,首尾空白不影响解析convert("2024-01-15", Date.class)拿到Mon Jan 15 00:00:00 CST 2024convert("2024-01-15 10:30:45", Long.class)拿到1705285845000convert("2024-01-15", Timestamp.class)拿到2024-01-15 00:00:00.0,只有日期就按当天零点补convert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), String.class)拿到2024-01-15 10:30:45convert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), LocalDate.class)拿到2024-01-15,只取日期部分convert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), Timestamp.class)拿到2024-01-15 10:30:45.0convert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), Long.class)拿到1705285845000convert(LocalDate.of(2024, 1, 15), LocalDateTime.class)拿到2024-01-15T00:00,纯日期按当天零点补convert(LocalDate.of(2024, 1, 15), String.class)拿到2024-01-15 00:00:00,字符串目标统一走日期时间格式convert(new java.sql.Time(1705285845000L), LocalDateTime.class)拿到2024-01-15T10:30:45,java.sql.Time也按毫秒换算,日期部分照带convert(Timestamp.valueOf("2024-01-15 10:30:45.123456789"), LocalDateTime.class)拿到2024-01-15T10:30:45.123456789,纳秒不丢convert(Timestamp.valueOf("2024-01-15 10:30:45.123456789"), Long.class)拿到1705285845123,只剩毫秒convert("2024-01-15T10:30:00Z", LocalDateTime.class)抛IllegalArgumentException,消息是「无法解析的时间字符串: 2024-01-15T10:30:00Z」convert("2024-02-30", LocalDate.class)抛IllegalArgumentException,消息是「无法解析的时间字符串: 2024-02-30」convert("2023-02-29", LocalDate.class)抛IllegalArgumentException,2023 不是闰年convert(1, String.class)抛IllegalArgumentException: 不支持的时间源类型: java.lang.Integerconvert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), LocalTime.class)抛IllegalArgumentException: 不支持的目标时间类型: java.time.LocalTimeconvert(null, String.class)抛NullPointerException: source 不能为 nullconvert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), null)抛NullPointerException: targetType 不能为 null
🔢方法序号:2
🎯方法用途:
- 把时间转成对端指定写法的字符串,格式由第三个参数给
- 省掉为每种输出格式新建一个
DateTimeFormatter,格式里写了给不出的字段也会被收进统一的异常
🧩方法定义:public static <T> T convert(Object source, Class<T> targetType, String pattern)
🗣️入参解释:public static <T> T convert(时间源, 目标类型, 输出格式)
📤返回值解释:T,与传入的目标类型同一个类型
💡边界口径:
pattern为null或全空白时回退默认格式yyyy-MM-dd HH:mm:ss- 目标类型不是
String时这个参数被完全忽略,照样按目标类型转 - 格式固定按英文语言环境构建,不受系统默认语言影响,
MMM给 Jan、MMMM给 January、EEEE给 Monday - 格式要求时间源给不出的字段(用
z要时区)时,底层的DateTimeException被包成IllegalArgumentException,消息带「时间转换失败: 」前缀 - 格式串对应的格式化器按格式缓存复用,上限 128 个,超了整体清空重建
- 其余类型与解析口径同方法1
🧪方法示例:
convert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), String.class, "yyyy年MM月dd日 EEEE")拿到2024年01月15日 Mondayconvert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), String.class, "dd MMM yyyy MMMM")拿到15 Jan 2024 January,文本字段给的是英文数据convert(1705285845000L, String.class, "yyyy年MM月dd日 HH时mm分")拿到2024年01月15日 10时30分,毫秒时间戳也能直接格式化convert(Timestamp.valueOf("2024-01-15 10:30:45.123456789"), String.class, "yyyy-MM-dd HH:mm:ss.SSS")拿到2024-01-15 10:30:45.123,格式只到毫秒convert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), String.class, null)拿到2024-01-15 10:30:45,格式给null用默认convert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), String.class, " ")拿到2024-01-15 10:30:45,全空白同样回退默认convert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), LocalDate.class, "yyyy年")拿到2024-01-15,目标不是字符串时格式参数不看convert(LocalDateTime.of(2024, 1, 15, 10, 30, 45), String.class, "yyyy-MM-dd z")抛IllegalArgumentException,消息是「时间转换失败: Unable to extract ZoneId from temporal 2024-01-15T10:30:45」- 系统默认时区切到
America/New_York后,convert(LocalDateTime.of(2024, 3, 10, 2, 30), Long.class)转出的时间戳再解回来拿到2024-03-10T03:30,02:30 落在夏令时空档里被顺延一小时 - 同一时区下
convert(LocalDateTime.of(2024, 11, 3, 1, 30), Long.class)拿到1730611800000,重叠时刻取的是开始那个偏移,回解还是 01:30
四、工具类源码(可直接复制)
📦领取方式: 关注点赞收藏,私信回复「java工具类」可领取100个工具类「Java企业级工具类全家桶(1-100)」的完整源码.。
💡 工具类已调试通过,复制粘贴即可使用,省时省力
💡 可保存到自己网盘,永久有效
觉得对您有帮助,麻烦点点关注啦,您的关注是我创作的最大动力~ 🎯