1. 一定要将自己的研究成果首发到我自己的博客上

  1. 这段时间换工作,新的公司用java8语法糖用的很多,上周开发一个需求,用到时间计算,因为这个时间计算,搞了两个小时。。。深感惭愧

  2. java都出到17了,我这java8的LocalDateTIme都没怎么研究过。。。感觉是有点说不过去啊,周末的时候在家把源码看了看,写了一个工具类,以便将来的开发过程中省时省力。

2. 这个工具类不一定是最好的,但肯定不是最差的

  • 适配所有时区,通过ZoneId得到的启发
public static final Map<String, String> SHORT_IDS = Map.ofEntries(entry("ACT", "Australia/Darwin"),entry("AET", "Australia/Sydney"),entry("AGT", "America/Argentina/Buenos_Aires"),entry("ART", "Africa/Cairo"),entry("AST", "America/Anchorage"),entry("BET", "America/Sao_Paulo"),entry("BST", "Asia/Dhaka"),entry("CAT", "Africa/Harare"),entry("CNT", "America/St_Johns"),entry("CST", "America/Chicago"),entry("CTT", "Asia/Shanghai"),entry("EAT", "Africa/Addis_Ababa"),entry("ECT", "Europe/Paris"),entry("IET", "America/Indiana/Indianapolis"),entry("IST", "Asia/Kolkata"),entry("JST", "Asia/Tokyo"),entry("MIT", "Pacific/Apia"),entry("NET", "Asia/Yerevan"),entry("NST", "Pacific/Auckland"),entry("PLT", "Asia/Karachi"),entry("PNT", "America/Phoenix"),entry("PRT", "America/Puerto_Rico"),entry("PST", "America/Los_Angeles"),entry("SST", "Pacific/Guadalcanal"),entry("VST", "Asia/Ho_Chi_Minh"),entry("EST", "-05:00"),entry("MST", "-07:00"),entry("HST", "-10:00"));
  • 源码中ZoneId将时区全部搞到一个map中,我这边直接搞成了枚举
public static enum LocalDateTimeType {/*** Australia/Darwin*/ACT,/*** Australia/Sydney*/AET,/*** America/Argentina/Buenos_Aires*/AGT,/*** Africa/Cairo*/ART,/*** America/Anchorage*/AST,/*** America/Sao_Paulo*/BET,/*** Asia/Dhaka*/BST,/*** Africa/Harare*/CAT,/*** America/St_Johns*/CNT,/*** America/Chicago*/CST,/*** Asia/Shanghai*/CTT,/*** Africa/Addis_Ababa*/EAT,/*** Europe/Paris*/ECT,/*** America/Indiana/Indianapolis*/IET,/*** Asia/Kolkata*/IST,/*** Asia/Tokyo*/JST,/*** Pacific/Apia*/MIT,/*** Asia/Yerevan*/NET,/*** Pacific/Auckland*/NST,/*** Asia/Karachi*/PLT,/*** America/Phoenix*/PNT,/*** America/Puerto_Rico*/PRT,/*** America/Los_Angeles*/PST,/*** Pacific/Guadalcanal*/SST,/*** Asia/Ho_Chi_Minh*/VST,/*** -05:00*/EST,/*** -07:00*/MST,/*** -10:00*/HST,NULL;private LocalDateTimeType() {}}
  • 通过枚举定位返回时区对应的时间
public ZoneId switchDate() {switch (this.type) {case ACT:case AET:case AGT:case ART:case AST:case BET:case BST:case CAT:case CNT:case CST:case CTT:case EAT:case ECT:case IET:case IST:case JST:case MIT:case NET:case NST:case PLT:case PNT:case PRT:case PST:case SST:case VST:case EST:case MST:case HST:return ZoneId.of(ZoneId.SHORT_IDS.get(type.toString()));case NULL:default:return ZoneId.of(ZoneId.systemDefault().getId());}}
  • 如果不传枚举值,默认为NULL,返回系统默认时间
public DateSwitch() {this.type = LocalDateTimeType.NULL;}

完整实现如下

package com.mxc.mockmvc.mockprojet.util;import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import java.util.Date;/*** @Project : mock-projet* @Package : com.mxc.mockmvc.mockprojet.util* @author : Terry* @email : terry.xu@mexc.com* @date : 2022年07月31日 6:33 PM*/
public class LocalDateUtil {public static final String FORMAT_DEFAULT = "yyyyMMdd";public static final String FORMAT_HOUR = "yyyyMMddHH";public static final String FORMAT_ALL = "yyyy-MM-dd HH:mm:ss";public static final String FORMAT_MIN = "yyyy-MM-dd HH:mm";public static final String FORMAT_CHINESE = "yyyy年MM月dd日";public static final String FORMAT_ALL_M = "yyyy-MM-dd HH:mm:ss.SSS";public static final String FORMAT_SMALL = "yyyyMMddHHmmss";public static final String FORMAT_SMALL_L = "yyyyMMddHHmmssSSS";public static final String FORMAT_SMALL_HOUR = "yyyyMMddHH";public static final String FORMAT_SMALL_MIN = "yyyyMMddHHmm";public static final String FORMAT_SMALL_OTHER = "yyMMddHHmmss";public static final String FORMAT_DEFAULT_SMALL = "yyyy-MM-dd";public static final String FORMAT_TIME = "HH:mm:ss";public static final String FORMAT_CHINESE_REMOVE_YEAR = "MM月dd日";/*** 秒 =》LocalDateTime* @param seconds* @param type 一般情况下指定为LocalDateUtil.LocalDateTimeType.CTT* @return*/public static LocalDateTime secondsToLDT(Long seconds, LocalDateTimeType type) {LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), new DateSwitch(type).switchDate());return localDateTime;}/*** 秒 =》LocalDateTime* @param seconds* @return*/public static LocalDateTime secondsToDefaultLDT(Long seconds) {LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochSecond(seconds), new DateSwitch().switchDate());return localDateTime;}/*** 毫秒 =》LocalDateTime* @param millSeconds* @param type 一般情况下指定为LocalDateUtil.LocalDateTimeType.CTT* @return*/public static LocalDateTime millSecondsToLDT(Long millSeconds, LocalDateTimeType type) {LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(millSeconds), new DateSwitch(type).switchDate());return localDateTime;}/*** 毫秒 =》LocalDateTime* @param millSeconds* @return*/public static LocalDateTime millSecondsToDefaultLDT(Long millSeconds) {LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(millSeconds), new DateSwitch().switchDate());return localDateTime;}/*** 两个LocalDateTime的Duration* @param beginTime* @param endTime* @return*/public static Duration timeDuration(LocalDateTime beginTime, LocalDateTime endTime) {Duration dur = Duration.between(beginTime, endTime);return dur;}/*** LocalDateTime 转 Date* @param time* @return*/public static Date convertDefaultLDTToDate(LocalDateTime time) {return Date.from(time.atZone(new DateSwitch().switchDate()).toInstant());}/*** LocalDateTime 转 Date* @param time* @param type 一般情况下指定为LocalDateUtil.LocalDateTimeType.CTT* @return*/public static Date convertLDTToDate(LocalDateTime time, LocalDateTimeType type) {return Date.from(time.atZone(new DateSwitch(type).switchDate()).toInstant());}/*** 获取指定日期的毫秒* @param time* @return*/public static Long getMillSecondsByDefaultLDT(LocalDateTime time) {return time.atZone(new DateSwitch().switchDate()).toInstant().toEpochMilli();}/*** 获取指定日期的毫秒* @param time* @param type 一般情况下指定为LocalDateUtil.LocalDateTimeType.CTT* @return*/public static Long getMillSecondsByLDT(LocalDateTime time, LocalDateTimeType type) {return time.atZone(new DateSwitch(type).switchDate()).toInstant().toEpochMilli();}/*** 获取指定日期的秒* @param time* @return*/public static Long getSecondsByDefaultLDT(LocalDateTime time) {return time.atZone(new DateSwitch().switchDate()).toInstant().getEpochSecond();}/*** 获取指定日期的秒* @param time* @param type 一般情况下指定为LocalDateUtil.LocalDateTimeType.CTT* @return*/public static Long getSecondsByLDT(LocalDateTime time, LocalDateTimeType type) {return time.atZone(new DateSwitch(type).switchDate()).toInstant().getEpochSecond();}/*** 获取指定时间的指定格式* @param time* @param pattern* @return*/public static String formatTime(LocalDateTime time, String pattern) {return time.format(DateTimeFormatter.ofPattern(pattern));}/*** 日期加上一个数,根据field不同加不同值,field为ChronoUnit.** @param time* @param number* @param field* @return*/public static LocalDateTime plus(LocalDateTime time, long number, TemporalUnit field) {return time.plus(number, field);}/*** 日期减去一个数,根据field不同减不同值,field参数为ChronoUnit.** @param time* @param number* @param field* @return*/public static LocalDateTime minus(LocalDateTime time, long number, TemporalUnit field) {return time.minus(number, field);}public static LocalDateTime convertStringToLDT(String timeStr, String pattern) {return LocalDateTime.parse(timeStr, DateTimeFormatter.ofPattern(pattern));}public static class DateSwitch {private LocalDateUtil.LocalDateTimeType type;public DateSwitch() {this.type = LocalDateTimeType.NULL;}public DateSwitch(LocalDateUtil.LocalDateTimeType type) {this.type = type;}public ZoneId switchDate() {switch (this.type) {case ACT:case AET:case AGT:case ART:case AST:case BET:case BST:case CAT:case CNT:case CST:case CTT:case EAT:case ECT:case IET:case IST:case JST:case MIT:case NET:case NST:case PLT:case PNT:case PRT:case PST:case SST:case VST:case EST:case MST:case HST:return ZoneId.of(ZoneId.SHORT_IDS.get(type.toString()));case NULL:default:return ZoneId.of(ZoneId.systemDefault().getId());}}}public static enum LocalDateTimeType {/*** Australia/Darwin*/ACT,/*** Australia/Sydney*/AET,/*** America/Argentina/Buenos_Aires*/AGT,/*** Africa/Cairo*/ART,/*** America/Anchorage*/AST,/*** America/Sao_Paulo*/BET,/*** Asia/Dhaka*/BST,/*** Africa/Harare*/CAT,/*** America/St_Johns*/CNT,/*** America/Chicago*/CST,/*** Asia/Shanghai*/CTT,/*** Africa/Addis_Ababa*/EAT,/*** Europe/Paris*/ECT,/*** America/Indiana/Indianapolis*/IET,/*** Asia/Kolkata*/IST,/*** Asia/Tokyo*/JST,/*** Pacific/Apia*/MIT,/*** Asia/Yerevan*/NET,/*** Pacific/Auckland*/NST,/*** Asia/Karachi*/PLT,/*** America/Phoenix*/PNT,/*** America/Puerto_Rico*/PRT,/*** America/Los_Angeles*/PST,/*** Pacific/Guadalcanal*/SST,/*** Asia/Ho_Chi_Minh*/VST,/*** -05:00*/EST,/*** -07:00*/MST,/*** -10:00*/HST,NULL;private LocalDateTimeType() {}}
}

java8的LocalDateTime还没搞懂?一文轻松解决掉你的烦恼相关推荐

  1. 升级过log4j,却还没搞懂log4j漏洞的本质?

    摘要:log4j远程代码漏洞问题被大范围曝光后已经有一段时间了,今天完整讲清JNDI和RMI以及该漏洞的深层原因. 本文分享自华为云社区<升级过log4j,却还没搞懂log4j漏洞的本质?为你完 ...

  2. 你还没搞懂的微信小程序,已成今年双十一电商黑马

    阿里今年双十一成交额达1682亿.京东11天的下单额达1271亿,各大财经媒体都在纷纷报道双十一全国各网上平台今年的创收,这些每年都在几十个百分点成长的数据无不让实体的各位老板瞠目结舌:然而还有一个很 ...

  3. 量子计算还没搞懂,光子计算又要来统治世界?

    [CSDN 编者按]去年 12 月,量子计算原型机"九章" 惊人的单项计算能力超过了 Google 当年水平,国人自己也手握一份"量子霸权",新年伊始,两篇关于 ...

  4. char类型怎么输入 c语言_还没搞懂C语言指针?这里有最详细的纯干货讲解(附代码)...

    21ic综合自网络信息 指针对于C来说太重要.然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识.所以本文尽可能的通过一篇文章完全讲解指针. 为什么 ...

  5. c语言指针f32*,还没搞懂C语言指针?这里有最详细的纯干货讲解(附代码)

    21ic综合自网络信息 指针对于C来说太重要.然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识.所以本文尽可能的通过一篇文章完全讲解指针. 为什么 ...

  6. 针对还没搞懂javascript中this关键字的同学

    本篇文章主要针对搞不清this指向的的同学们!不定期更新文章都是我学习过程中积累下的经验,还请大家多多关注我的文章以帮助更多的同学,不对的地方还望留言支持改进! 首先,必须搞清楚在JS里面,函数的几种 ...

  7. 还没搞懂串口通信?一文带你读懂

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 还记得当年的打印机,鼠标和调制解调器吗?他们都有巨大笨重的连接器和粗电缆,并且必须拧 ...

  8. 还没搞懂正则?熬夜到虚脱整理出来的Python的正则表达式总结(Regular Expression)

    前言: 作者:神的孩子在歌唱 这是我听老师讲课做的笔记 大家好,我叫陈运智,大家可以叫我智 正则表达式 一. python正则表达式介绍 二. re模块 2.1 match方法 2.2 匹配规则 2. ...

  9. c语言的真假,C语言丨还没搞懂逻辑运算符?一篇文章教你区分“真假”!

    这两天有遇到一些小伙伴,对于逻辑运算符号都不认识,不知道它代表什么意思,今天就来简单讲讲逻辑运算符. 逻辑运算符 关系运算符只是测试左右两个值之间的关系(把它们相互比较),逻辑运算符(logical ...

最新文章

  1. Apache Kafka-事务消息的支持与实现(本地事务)
  2. Lucene使用案例(包括索引的维护)
  3. Java开发中遇到具有挑战的事_Java并发编程的挑战:遇到的问题及如何解决
  4. python基本概念_python基本概念-关键要素
  5. typescript或javascript深拷贝Object json
  6. spring mvc对异步请求的处理
  7. STM32工作笔记0048---Systick滴答定时器---延时函数讲解
  8. 动易访问mysql_服务器如何设置动易系统数据库路径的方法
  9. 线性同余法生成随机数
  10. dedecms如何制作中英文切换的网站?
  11. XMLHttpRequest请求跨域问题解决方案
  12. 再Windows下 .Pages格式怎么保存为word或者PDF格式
  13. 有意思,原来SQL中的NULL是这么回事儿
  14. 华硕z590和微星z590哪个好
  15. 【文学文娱】《人类简史》--从动物到上帝
  16. 《神经网络与深度学习》习题解答(至第七章)
  17. 2021-2022学年广州市海珠区九年级第一学期期中统考英语试题
  18. Flink Partitioning,不只是Shuffle
  19. 吉大400+计算机软件人工智能考研攻略
  20. xxl-job优雅停止执行器即客户端tomcat

热门文章

  1. 【个人作品】全动态采购单价分析--改进ABC模型(帕累托分析)的一些心得
  2. java的Object类有哪些方法
  3. 木瓜移动每日资讯0517:质量效应传奇版冲上了Steam周销量榜榜首
  4. WSL-Centos8 Sstream 安装Vim
  5. 树莓派c语言pca9685,使用树莓派控制16路舵机驱动板(pca9685)
  6. 一元二次方程(有实根) (300 分)
  7. android h5app息屏定时器,H5案例分享:JS设置定时器和清除定时器
  8. vue富文本框(插入文本、图片、视频)的使用
  9. 解决ubuntu火狐无法上网问题
  10. RuntimeError: CUDA out of memory. Tried to allocate 14.00 MiB linux跑深度学习爆显存问题