LocalDateTime等新出的日期类全是final修饰的类,不能被继承,且对应的日期变量都是final修饰的,也就是不可变类。赋值一次后就不可变,不存在多线程数据问题。

  simpleDateFormat.parse()
simpleDateFormat.format() 注意calendar.setTime(date);,Calendar类是里面基本都是final修饰的,calendar是共享变量,并且这个共享变量没有做线程安全控制。当多个线程同时使用相同的SimpleDateFormat对象【如用static修饰的SimpleDateFormat,一般会封装在工具类,复用】调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。 在多并发情况下使用SimpleDateFormat需格外注意: SimpleDateFormat除了format方法是线程不安全以外,parse方法也是线程不安全的。parse方法实际调用alb.establish(calendar).getTime()方法来解析,alb.establish(calendar)方法里主要完成了

平时封装工具时,封装个静态的SimpleDataFormat
里面这个变量时共享变量,多线程时会出现这样的场景:
A先设置,B也来设置时间值,由于并发了,后面C也来设置值,导致A,B取的值可能时C设置的值
结尾送上个我个人封装java8新的时间工具类供大家使用
package util.bloomfilter;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date; /**
* java8时间工具类
*/
public class DateUtil {
private DateUtil() throws Exception {
throw new Exception("时间工具禁止new");
} public static final String YYYYMMDDHHMMSSS = "yyyyMMddHHmmss";
public static final String YYYY_MM_DD_HH_DD_SS_TIME = "yyyy-MM-dd HH:mm:ss";
public static final String YYYYMMDDHHMMSSTIME = "yyyy/MM/dd HH:mm:ss";
public static final String YYYY_MM_DD = "yyyy-MM-dd";
public static final String YYYYMMDD = "yyyy/MM/dd";
public static final String YYYYMMDDDATE = "yyyyMMdd"; //根据时间格式化成指定格式日期yyyyMMddHHmmss的字符串
public static String getYYYYMMDDHHMMSSS(LocalDateTime localDateTime) {
//时间传唤为指定格式字符串
return localDateTime.format(DateTimeFormatter.ofPattern(YYYYMMDDHHMMSSS));
} //根据时间格式化成指定格式日期yyyy-MM-dd HH:mm:ss的字符串
public static String getYYYY_MM_DD_HH_DD_SS_TIME(LocalDateTime localDateTime) {
//时间传唤为指定格式字符串
return localDateTime.format(DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_DD_SS_TIME));
} //根据时间格式化成指定格式日期yyyy/MM/dd HH:mm:ss的字符串
public static String getYYYYMMDDHHMMSSTIME(LocalDateTime localDateTime) {
return localDateTime.format(DateTimeFormatter.ofPattern(YYYYMMDDHHMMSSTIME));
} //根据时间格式化成指定格式日期yyyy-MM-dd的字符串
public static String getYYYYMMDD(LocalDateTime localDateTime) {
return localDateTime.format(DateTimeFormatter.ofPattern(YYYY_MM_DD));
} //根据时间格式化成指定格式日期yyyy/MM/dd的字符串
public static String getYYYYMMDD01(LocalDateTime localDateTime) {
return localDateTime.format(DateTimeFormatter.ofPattern(YYYYMMDD));
} //根据时间格式化成指定格式日期yyyyMMdd的字符串
public static String getYYYYMMDDDATE(LocalDateTime localDateTime) {
return localDateTime.format(DateTimeFormatter.ofPattern(YYYYMMDDDATE));
} /**
* 以上是日期转换为指定格式字符串
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*
*/ //yyyy-MM-dd HH:mm:ss格式字符串 转化为时间
public static LocalDateTime YYYY_MM_DD_HH_DD_SS_TIME_TO_LocalDateTime(String dateStr) {
return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_DD_SS_TIME));
} //YYYYMMDDHHMMSSS格式字符串 转化为时间
public static LocalDateTime YYYYMMDDHHMMSSS_TO_LocalDateTime(String dateStr) {
return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(YYYYMMDDHHMMSSS));
} //yyyy/MM/dd HH:mm:ss 格式字符串 转化为时间
public static LocalDateTime YYYYMMDDHHMMSSTIME_TO_LocalDateTime(String dateStr) {
return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(YYYYMMDDHHMMSSTIME));
} //yyyy-MM-dd 格式字符串 转化为时间
public static LocalDate YYYY_MM_DD_TO_LocalDateTime(String dateStr) {
return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(YYYY_MM_DD));
} //yyyy/MM/dd 格式字符串 转化为时间
public static LocalDate YYYYMMDD_TO_LocalDateTime(String dateStr) {
return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(YYYYMMDD));
}
//yyyyMMdd 格式字符串 转化为时间
public static LocalDate YYYYMMDDDATE_TO_LocalDateTime(String dateStr) {
return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(YYYYMMDDDATE));
} /**
* 以上是指定格式字符串换为相应日期
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*
*/ //毫秒计时间戳
public static Long getMillionsTime(LocalDateTime localDateTime) {
return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
} //秒计时间戳
public static Long getSeconds(LocalDateTime localDateTime) {
return localDateTime.toEpochSecond(ZoneOffset.of("+8"));
} /**
* 以上是日期转化为时间戳
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*
*/ //秒级时间戳转化为LocalDateTime
// 入参是这种 时间戳 long second = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).getEpochSecond();
public static LocalDateTime getSeconds(Long seconds) {
//当前市区时间
LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.ofHours(8));
return localDateTime;
} //秒级时间戳转化为LocalDateTime
// 入参是这种 时间戳 long milliseconds = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
public static LocalDateTime milliseconds(Long milliseconds) {
LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(milliseconds/1000, 0, ZoneOffset.ofHours(8));
return localDateTime;
} //精确毫秒级别 保留三位小数的那种
//入参 long milliseconds = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
public static LocalDateTime millisecondsppoint(Long milliseconds) {
LocalDateTime localDateTime = Instant.ofEpochMilli(milliseconds).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
return localDateTime;
} /**
* 以上是时间戳转化为日期
* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*
*/ //LocalDateTime 转化为 Date
public static Date getLocalDateTime_TO_DateTime(LocalDateTime localDateTime){
// 获得 Instant
Instant instant = Instant.ofEpochSecond(localDateTime.toEpochSecond(ZoneOffset.ofHours(8)));
// 获得 Date
Date date = Date.from(instant);
return date;
} //LocalDateTime 转化为 Date
public static Date getLocalDateTime_TO_DateTime0(LocalDateTime localDateTime){
// 获得 Instant
Instant instant = localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant();
// 获得 Date
Date date = Date.from(instant);
return date;
} //LocalDate 转化为 Date
public static Date getLocalDate_TO_Date(LocalDate localDate){
// 获得 Instant
Instant instant = localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant();
// 获得 Date
Date date = Date.from(instant);
return date;
} // Date转化为 LocalDate
public static LocalDate getLocalDate(Date date){
// 获得 LocalDate
LocalDate localDate = date.toInstant().atOffset(ZoneOffset.ofHours(8)).toLocalDate();
return localDate;
} public static void main(String[] args) {
// String str="2021-08-27 10:41:22";
// System.out.println(DateUtil.YYYY_MM_DD_HH_DD_SS_TIME_TO_LocalDateTime(str));
// String str0="20210827104122";
// System.out.println(DateUtil.YYYYMMDDHHMMSSS_TO_LocalDateTime(str0));
// String str1="2021/08/27 10:41:22";
// System.out.println(DateUtil.YYYYMMDDHHMMSSTIME_TO_LocalDateTime(str1));
// String str2="2021-08-27";
// System.out.println(DateUtil.YYYY_MM_DD_TO_LocalDateTime(str2));
// String str3="2021/08/27";
// System.out.println(DateUtil.YYYYMMDD_TO_LocalDateTime(str3));
// String str4="20210827";
// System.out.println(DateUtil.YYYYMMDDDATE_TO_LocalDateTime(str4)); //秒转化为日期
// long second = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).getEpochSecond();
// System.out.println(second);
// System.out.println(DateUtil.getSeconds(second));
//
//毫秒转化日期
// long milliseconds = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
// System.out.println(milliseconds);
// System.out.println(DateUtil.milliseconds(milliseconds));
//毫秒转化为毫秒精确级别日期
// long millisecondss = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
// System.out.println(millisecondss);
// System.out.println(DateUtil.millisecondsppoint(millisecondss)); System.out.println(DateUtil.getLocalDateTime_TO_DateTime(LocalDateTime.now()));
System.out.println(DateUtil.getLocalDate_TO_Date(LocalDate.now()));
System.out.println(DateUtil.getLocalDate(new Date())); } }

java8时间类API安全问题(赠送新的时间工具类哟)的更多相关文章

  1. Expo大作战(二十七)--expo sdk api之Util(expo自带工具类),tackSnapshotAsync,Svg,SQLite

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  2. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  3. BadgeView新提示开源工具类

    BadgeView是使用某个图标作为新功能的提醒,类似于收到短息后短信图标的右上方有信息数目或者其他的显示性提示.BadgeView很好的实现了这个功能,而且进行了拓展,可自定义位置和提示图标. 工具 ...

  4. 【转载】C#工具类:实现文件操作File的工具类

    在应用程序的开发中,文件操作的使用基本上是必不可少的,FileStream类.StreamWriter类.Directory类.DirectoryInfo类等都是文件操作中时常涉及到的类,我们可以通过 ...

  5. mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口

    搭建项目 一:lib(关于框架的jar包和数据库驱动的jar包) 1,第一步:先把mybatis的核心类库放进lib里

  6. UUID与System.currentTimeMillis()产生一个新文件名的工具类

    1.FileUtils.java package Utils.GenerateNewFileName; import java.util.UUID; public class FileUtils { ...

  7. Vcode的生成工具类,生成制定长度验证码,图文验证码工具类

    public class VCodeUtils { // 使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符 public static f ...

  8. 【工具类】获取Http请求IP的工具类

    public class IpAddressUtil { public static String getIpAddr(HttpServletRequest request){ String ipAd ...

  9. 【工具类】获取请求头中User-Agent工具类

    public class AgentUserKit { private static String pattern = "^Mozilla/\\d\\.\\d\\s+\\(+.+?\\)&q ...

随机推荐

  1. springMVC-8-jackson使用

    springMVC默认的 Json 解决方案是 Jackson, 所以只需要导入 Jackson 的 jar, 即可使用 <!--Jackson--> <dependency> ...

  2. 微信小程序云开发-数据库-更新数据

    一.js文件代码使用.update更新数据 写一个更新数据的函数,函数内使用.update更新数据.一定要通过.doc指定修改哪一条数据.  二.wxml文件修改数据的按钮 在wxml文件中写[修改] ...

  3. Deepin 20.2.2 /UOS 20.2 添加ppa源

    由于 工作需要,需要通过PPA安装一些优质的软件包,但是 Deepin 默认不支持PPA源 解决方法 由于Deepin/Uos系统默认是没有安装PPA的那么我们得先安装PPA来支持"add- ...

  4. 谈一下python中的列表

    Python标准库基于C语言实现了丰富的序列类型包括元组,列表,字典... 今天我们只谈list(列表) 1 列表(list) 最基础也是最重要的序列类型,他本身可以存放不同数据类型的元素.列表推导是 ...

  5. 解决IDEA右侧maven不显示方法

    解决IDEA右侧maven不显示方法 Ctrl+shift+A --> maven--> add maven projects -->选择对应的pom.xml

  6. videojs文档翻译Guides-components

    components Components Video.js播放器的架构围绕组件. Player类和所有表示播放器控件和其他UI元素的类都继承自Component类. 这种架构使得可以轻松地以反映DO ...

  7. xss常见方式

    1.<script>alert(1)</script> 2.源码第一个,[<]被转义,因此在第二个里 "><script>alert(1)&l ...

  8. Git,Linux,Ubuntu,Tmux的常用命令

    常用的连接 Git命令 廖雪峰的Git教程 Git常用命令 ubuntu16.04之GitHub入门教程 Linux相关 tmux命令 Ubuntu常用命令速查手册 Linux 命令大全 其它工具 M ...

  9. 大数据学习(14)—— HBase进阶

    HBase读写流程 在网上找了一张图,这个画的比较简单,就拿这个图来说吧. 写流程 1.当Client发起一个Put请求时,首先访问Zookeeper获取hbase:meta表. 2.从hbase:m ...

  10. 大数据学习(06)——Ozone介绍

    前面几篇文章把Hadoop常用的模块都学习了,剩下一个新模块Ozone,截止到今天最新版本是0.5.0Beta,还没出正式版.好在官方网站有文档,还是中文版的,但是中文版资料没有翻译完整,我试着把它都 ...