当前位置: 首页 > news >正文

java8日期时间工具类

【README】

1)本文总结了java8中日期时间常用工具方法;包括:

  • 日期时间对象格式化为字符串;
  • 日期时间字符串解析为日期时间对象;
  • 日期时间对象转换;
    • 转换过程中,需要注意的是: Instant与Date带时区(易变),而LocalDateTime,LocalDate,LocalTime 不带时区(不可变)

2)日期时间工具类定义如下:

public class BusiDateTimeUtils {/** 日期时间格式化器 */private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");/** 日期格式化器 */private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");private BusiDateTimeUtils() {// do nothing.}
// .................... 
}

 


【1】当前日期时间操作

/** -------------------- 1. 当前日期时间操作 -------------------- */public static String getNowLocalDateTimeStr() {return LocalDateTime.now().format(DATETIME_FORMATTER);}public static String getNowLocalDateStr() {return LocalDate.now().format(DATE_FORMATTER);}

【1.1】单测案例:

/** -------------------- 1. 当前日期时间操作 -------------------- */@Testpublic void test1() {// 获取当前日期时间String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+nowLocalDateTimeStr); // 2023-10-05 21:28:09// 获取当前日期String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05}

【2】字符串解析为日期时间对象

 /** -------------------- 2. 字符串解析为日期时间对象 -------------------- */public static LocalDateTime parseLocalDateTime(String dateTimeStr) {return LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER);}public static LocalDate parseLocalDate(String dateStr) {return LocalDate.parse(dateStr, DATE_FORMATTER);}

【2.1】单测案例

/** -------------------- 2. 字符串解析为日期时间对象 -------------------- */@Testpublic void test2() {// 解析当前日期时间String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:29:32LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);System.out.println(parsedLocalDateTime); // 2023-10-05T21:29:32// 解析当前日期String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);System.out.println(parsedLocalDate); // 2023-10-05}

【3】日期时间对象格式化为字符串

/** -------------------- 3. 日期时间对象格式化为字符串 -------------------- */public static String format(LocalDateTime localDateTime) {return localDateTime.format(DATETIME_FORMATTER);}public static String format(LocalDate localDate) {return localDate.format(DATE_FORMATTER);}

【3.1】单测案例

/** -------------------- 3. 日期时间对象格式化为字符串 -------------------- */@Testpublic void test3() {// 格式化当前日期时间对象为字符串String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:35:19LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);String formatedLocalDateTime = BusiDateTimeUtils.format(parsedLocalDateTime);System.out.println(formatedLocalDateTime); // 2023-10-05 21:35:19// 格式化当前日期对象为字符串String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);String formatedLocalDate = BusiDateTimeUtils.format(parsedLocalDate);System.out.println(formatedLocalDate); // 2023-10-05}

【4】*LocalDateTime 转为其他日期时间类型(重要)

/** -------------------- 4. LocalDateTime 转为其他日期时间类型 -------------------- */public static LocalDate toLocalDate(LocalDateTime localDateTime) {return localDateTime.toLocalDate();}public static Instant toInstant(LocalDateTime localDateTime) {return localDateTime.toInstant(ZoneOffset.UTC);}public static Date toDate(LocalDateTime localDateTime) {return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());}

【说明】LocalDateTime 转 Instant与Date时,做了一些特殊处理:

  • LocalDateTime没有时区,而Instant有时区;为了统一,把Instant的时区设置为0时区(UTC),则LocalDateTime与Instant都没有时区了;
  • LocalDateTime没有时区,Instant有时区,Date有时区:
    • 先把 LocalDateTime转为带时区的日期时间 ZonedDateTime
    • 再把 ZonedDateTime 转 Instant(默认时区为系统时区);
    • 最后把Instant转Date(默认时区为系统时区); 

【4.1】单测案例

/** -------------------- 4. LocalDateTime 转为其他日期时间类型 -------------------- */@Testpublic void test4() {LocalDateTime nowLocalDateTime = LocalDateTime.now();System.out.println("nowLocalDateTimeStr="+BusiDateTimeUtils.format(nowLocalDateTime)); // 2023-10-05 21:37:14// LocalDateTime 转 LocalDateLocalDate localDate = BusiDateTimeUtils.toLocalDate(nowLocalDateTime);LocalDate localDate2 = nowLocalDateTime.toLocalDate(); // 与上一行代码效果一样System.out.println("localDate=" + localDate); // 2023-10-05// LocalDateTime 转 InstantInstant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDateTime);System.out.println(nowInstant); // 2023-10-05T21:37:14.677Z// LocalDateTime 转 DateDate nowDate = BusiDateTimeUtils.toDate(nowLocalDateTime);System.out.println(nowDate); // Thu Oct 05 21:37:14 CST 2023 }

【5】LocalDate 转为其他日期时间类型

/** -------------------- 5. LocalDate 转为其他日期时间类型 -------------------- */public static LocalDateTime toLocalDateTime(LocalDate localDate) {return localDate.atStartOfDay();}public static Instant toInstant(LocalDate localDate) {return localDate.atStartOfDay().toInstant(ZoneOffset.UTC);}public static Date toDate(LocalDate localDate) {return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());}

【说明】LocalDate 转 Instant与Date时,做了一些特殊处理:与 LocalDateTime 转 Instant与Date类似 ,这里不再赘述;参见本文章节【4】;

【5.1】单测案例

/** -------------------- 5. LocalDate 转为其他日期时间类型 -------------------- */@Testpublic void test5() {LocalDate nowLocalDate = LocalDate.now();System.out.println("nowLocalDateStr="+BusiDateTimeUtils.format(nowLocalDate)); // 2023-10-05// LocalDate 转 LocalDateTimeLocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowLocalDate);System.out.println("localDateTime=" + localDateTime); // 2023-10-05T00:00// LocalDate 转 InstantInstant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDate);System.out.println(nowInstant); // 2023-10-05T00:00// LocalDate 转 DateDate nowDate = BusiDateTimeUtils.toDate(nowLocalDate);System.out.println(nowDate); //  Thu Oct 05 00:00:00 CST 2023}

【6】Instant 转为其他日期时间类型

/** -------------------- 6. Instant 转为其他日期时间类型 -------------------- */public static LocalDateTime toLocalDateTime(Instant instantWithoutZone) {return LocalDateTime.ofInstant(instantWithoutZone, ZoneOffset.UTC);}public static LocalDate toLocalDate(Instant instantWithoutZone) {return toLocalDateTime(instantWithoutZone).toLocalDate();}public static Date toDate(Instant instantWithoutZone) {return toDate(toLocalDateTime(instantWithoutZone));}

【说明】

注意上述工具方法中入参 Instant变量是不带时区的,也可以理解为时区为UTC(0时区)

【6.1】单测案例

/** -------------------- 6. Instant 转为其他日期时间类型 -------------------- */@Testpublic void test6() {Instant nowInstantWithoutZone = LocalDateTime.now().toInstant(ZoneOffset.UTC);System.out.println("nowZonedInstant="+nowInstantWithoutZone); // 2023-10-05T22:00:54.783ZSystem.out.println("Instant.now()=" + Instant.now()); // 2023-10-05T14:00:54.798Z(注意这里晚了8个小时)// Instant 转 LocalDateTimeLocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowInstantWithoutZone);System.out.println("localDateTime=" + localDateTime); // 2023-10-05T22:00:54.783// Instant 转 LocalDateLocalDate localDate = BusiDateTimeUtils.toLocalDate(nowInstantWithoutZone);System.out.println("localDate=" + localDate); // 2023-10-05// Instant 转 DateDate date = BusiDateTimeUtils.toDate(nowInstantWithoutZone);System.out.println("date=" + date); // date=Thu Oct 05 22:00:54 CST 2023 }

【7】总结

【7.1】日期时间工具类

/*** @Description 日期时间工具类* @author xiao tang* @version 1.0.0* @createTime 2023年10月05日*/
public class BusiDateTimeUtils {/** 日期时间格式化器 */private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");/** 日期格式化器 */private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");private BusiDateTimeUtils() {// do nothing.}/** -------------------- 1. 当前日期时间操作 -------------------- */public static String getNowLocalDateTimeStr() {return LocalDateTime.now().format(DATETIME_FORMATTER);}public static String getNowLocalDateStr() {return LocalDate.now().format(DATE_FORMATTER);}/** -------------------- 2. 字符串解析为日期时间对象 -------------------- */public static LocalDateTime parseLocalDateTime(String dateTimeStr) {return LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER);}public static LocalDate parseLocalDate(String dateStr) {return LocalDate.parse(dateStr, DATE_FORMATTER);}/** -------------------- 3. 日期时间对象格式化为字符串 -------------------- */public static String format(LocalDateTime localDateTime) {return localDateTime.format(DATETIME_FORMATTER);}public static String format(LocalDate localDate) {return localDate.format(DATE_FORMATTER);}/** -------------------- 4. LocalDateTime 转为其他日期时间类型 -------------------- */public static LocalDate toLocalDate(LocalDateTime localDateTime) {return localDateTime.toLocalDate();}public static Instant toInstant(LocalDateTime localDateTime) {return localDateTime.toInstant(ZoneOffset.UTC);}public static Date toDate(LocalDateTime localDateTime) {return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());}/** -------------------- 5. LocalDate 转为其他日期时间类型 -------------------- */public static LocalDateTime toLocalDateTime(LocalDate localDate) {return localDate.atStartOfDay();}public static Instant toInstant(LocalDate localDate) {return localDate.atStartOfDay().toInstant(ZoneOffset.UTC);}public static Date toDate(LocalDate localDate) {return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());}/** -------------------- 6. Instant 转为其他日期时间类型 -------------------- */public static LocalDateTime toLocalDateTime(Instant instantWithoutZone) {return LocalDateTime.ofInstant(instantWithoutZone, ZoneOffset.UTC);}public static LocalDate toLocalDate(Instant instantWithoutZone) {return toLocalDateTime(instantWithoutZone).toLocalDate();}public static Date toDate(Instant instantWithoutZone) {return toDate(toLocalDateTime(instantWithoutZone));}
}

【7.2】日期时间工具类单测案例

/*** @Description 日期时间工具类单测案例 * @author xiao tang* @version 1.0.0* @createTime 2023年10月05日*/
public class BusiDateTimeUtilsTest {/** -------------------- 1. 当前日期时间操作 -------------------- */@Testpublic void test1() {// 获取当前日期时间String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+nowLocalDateTimeStr); // 2023-10-05 21:28:09// 获取当前日期String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05}/** -------------------- 2. 字符串解析为日期时间对象 -------------------- */@Testpublic void test2() {// 解析当前日期时间String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:29:32LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);System.out.println(parsedLocalDateTime); // 2023-10-05T21:29:32// 解析当前日期String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);System.out.println(parsedLocalDate); // 2023-10-05}/** -------------------- 3. 日期时间对象格式化为字符串 -------------------- */@Testpublic void test3() {// 格式化当前日期时间对象为字符串String nowLocalDateTimeStr = BusiDateTimeUtils.getNowLocalDateTimeStr();System.out.println("nowLocalDateTimeStr="+ nowLocalDateTimeStr); // 2023-10-05 21:35:19LocalDateTime parsedLocalDateTime = BusiDateTimeUtils.parseLocalDateTime(nowLocalDateTimeStr);String formatedLocalDateTime = BusiDateTimeUtils.format(parsedLocalDateTime);System.out.println(formatedLocalDateTime); // 2023-10-05 21:35:19// 格式化当前日期对象为字符串String nowLocalDateStr = BusiDateTimeUtils.getNowLocalDateStr();System.out.println("nowLocalDateStr=" + nowLocalDateStr); // 2023-10-05LocalDate parsedLocalDate = BusiDateTimeUtils.parseLocalDate(nowLocalDateStr);String formatedLocalDate = BusiDateTimeUtils.format(parsedLocalDate);System.out.println(formatedLocalDate); // 2023-10-05}/** -------------------- 4. LocalDateTime 转为其他日期时间类型 -------------------- */@Testpublic void test4() {LocalDateTime nowLocalDateTime = LocalDateTime.now();System.out.println("nowLocalDateTimeStr="+BusiDateTimeUtils.format(nowLocalDateTime)); // 2023-10-05 21:37:14// LocalDateTime 转 LocalDateLocalDate localDate = BusiDateTimeUtils.toLocalDate(nowLocalDateTime);LocalDate localDate2 = nowLocalDateTime.toLocalDate(); // 与上一行代码效果一样System.out.println("localDate=" + localDate); // 2023-10-05// LocalDateTime 转 InstantInstant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDateTime);System.out.println(nowInstant); // 2023-10-05T21:37:14.677Z// LocalDateTime 转 DateDate nowDate = BusiDateTimeUtils.toDate(nowLocalDateTime);System.out.println(nowDate); // Thu Oct 05 21:37:14 CST 2023}/** -------------------- 5. LocalDate 转为其他日期时间类型 -------------------- */@Testpublic void test5() {LocalDate nowLocalDate = LocalDate.now();System.out.println("nowLocalDateStr="+BusiDateTimeUtils.format(nowLocalDate)); // 2023-10-05// LocalDate 转 LocalDateTimeLocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowLocalDate);System.out.println("localDateTime=" + localDateTime); // 2023-10-05T00:00// LocalDate 转 InstantInstant nowInstant = BusiDateTimeUtils.toInstant(nowLocalDate);System.out.println(nowInstant); // 2023-10-05T00:00// LocalDate 转 DateDate nowDate = BusiDateTimeUtils.toDate(nowLocalDate);System.out.println(nowDate); //  Thu Oct 05 00:00:00 CST 2023}/** -------------------- 6. Instant 转为其他日期时间类型 -------------------- */@Testpublic void test6() {Instant nowInstantWithoutZone = LocalDateTime.now().toInstant(ZoneOffset.UTC);System.out.println("nowZonedInstant="+nowInstantWithoutZone); // 2023-10-05T22:00:54.783ZSystem.out.println("Instant.now()=" + Instant.now()); // 2023-10-05T14:00:54.798Z(注意这里晚了8个小时)// Instant 转 LocalDateTimeLocalDateTime localDateTime = BusiDateTimeUtils.toLocalDateTime(nowInstantWithoutZone);System.out.println("localDateTime=" + localDateTime); // 2023-10-05T22:00:54.783// Instant 转 LocalDateLocalDate localDate = BusiDateTimeUtils.toLocalDate(nowInstantWithoutZone);System.out.println("localDate=" + localDate); // 2023-10-05// Instant 转 DateDate date = BusiDateTimeUtils.toDate(nowInstantWithoutZone);System.out.println("date=" + date); // date=Thu Oct 05 22:00:54 CST 2023}
}

http://www.lryc.cn/news/182945.html

相关文章:

  • 算法-动态规划/trie树-单词拆分
  • React框架核心原理
  • python-pytorch 利用pytorch对堆叠自编码器进行训练和验证
  • 制作 3 档可调灯程序编写
  • 源码分享-M3U8数据流ts的AES-128解密并合并---GoLang实现
  • CSDN Q: “这段代码算是在STC89C52RC51单片机上完成PWM呼吸灯了吗?“
  • Linux系统编程系列之线程池
  • Linux CentOS7 vim多文件与多窗口操作
  • SPI 通信协议
  • 【图像处理】使用各向异性滤波器和分割图像处理从MRI图像检测脑肿瘤(Matlab代码实现)
  • 5个适合初学者的初级网络安全工作,网络安全就业必看
  • Kafka核心原理
  • 探秘前后端开发世界:猫头虎带你穿梭编程的繁忙街区,解锁全栈之路
  • 洛谷_分支循环
  • MySQL数据库入门到精通——进阶篇(3)
  • Mind Map:大语言模型中的知识图谱提示激发思维图10.1+10.2
  • [引擎开发] 杂谈ue4中的Vulkan
  • docker--redis容器部署及地理空间API的使用示例-II
  • Vue中如何进行文件浏览与文件管理
  • jenkins利用插件Active Choices Plug-in达到联动显示或隐藏参数,且参数值可修改
  • 香蕉叶病害数据集
  • 天地无用 - 修改朋友圈的定位: 高德地图 + 爱思助手
  • AtCoder Beginner Contest 232(A-G)
  • 计算机网络(第8版)-第5章 运输层
  • AtCoder Beginner Contest 231(D-F,H)
  • 【Python】map
  • Swift 5.9 与 SwiftUI 5.0 中新 Observation 框架应用之深入浅出
  • 【已解决】在 Vite 项目中使用 eslint-config-ali 时遇到的解析错误
  • 蓝桥杯每日一题2023.10.5
  • PyTorch实例:简单线性回归的训练和反向传播解析