日期格式化为yyyymmdd_你还在用SimpleDateFormat格式化时间嘛

Jdk1.8之时间处理

该文章已经同步到Github:https://github.com/stackInk/makerstack

1. 传统时间处理的问题

1.1 多线程环境下的SimpleDateFormat

当多个线程使用同一个时间处理对象进行对日期的格式化的时候,会出现java.lang.NumberFormatException: multiple points。主要原因是由于SimpleDateFormat是线程不安全的,当线程共享的时候,会引发这个异常。

1.1.1 代码演示

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
//线程池中线程共享了SimpleDateFormat,引发线程不安全
Callable<String> callable = () -> simpleDateFormat.parse("20200402").toString();ExecutorService executorService = Executors.newFixedThreadPool(10);
List<Future<String>> list = new LinkedList<>();for (int i = 0; i < 10; i++) {Future<String> submit = executorService.submit(callable);list.add(submit);
}
for (Future<String> stringFuture : list) {String s = stringFuture.get();System.out.println(s);
}
executorService.shutdown();

解决方法:

  • 线程不共享变量SimpleDateFormat,每一个线程在进行日期格式化的时候都自己创建一个
ExecutorService executorService = Executors.newFixedThreadPool(10);
List<Future<String>> list = new LinkedList<>();
for (int i = 0; i < 10; i++) {Future<String> submit = executorService.submit(new MyCallable01("20200403"));list.add(submit);
}
for (Future<String> stringFuture : list) {String s = stringFuture.get();System.out.println(s);}
executorService.shutdown();class MyCallable01 implements Callable<String>{private String date ;public MyCallable01(String date) {this.date = date;}@Overridepublic String call() throws Exception {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");return simpleDateFormat.parse(date).toString();}
}
  • 通过ThreadLocal为每一个线程绑定一个SimpleDateFormate
Future<String> submit = executorService.submit(() -> ResolveByThreadLocal.converDateStrToDate("20200405"));public class ResolveByThreadLocal {//创建一个绑定每一个变量的ThreadLocalprivate static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<>();public static String converDateStrToDate(String date) throws ParseException {SimpleDateFormat simpleDateFormat = threadLocal.get(); ;if(simpleDateFormat == null){simpleDateFormat = new SimpleDateFormat("yyyyMMdd");threadLocal.set(simpleDateFormat);}Date parse = simpleDateFormat.parse(date);return parse.toString() ;}
}

2. 1.8时间处理

对于时间的处理,均在java.time包及其子包中,且线程安全

bcd23c303b673e1a1f2454895c48802e.png
  • java.time包下存放了进行时间处理的各种类
    • Instant获取本地时间的时间戳
    • LocalDate获取本地时间的日期
    • LocalTime获取本地时间的时间
    • LocalDateTime获取本地时间的日期和时间
    • Duration计算两个日期之间的间隔
    • Period计算两个时间的间隔
    • OffsetDateTime对日期和时间进行偏移量计算
    • offsetTime对时间进行偏移量计算
    • ZoneId各种时区代码
    • ZoneOffset市区偏移量计算
    • ZonedDateTime
  • java.time.chrono不同地区时间记时方式
  • java.time.temporal对时间进行一些调整的包
  • java.time.format对时间进行格式化

2.1 LocalDate、LocalTime、LocalDateTime

三者的使用方式完全相同,输出的结果不同

  • now获取本地时间
LocalDateTime now = LocalDateTime.now();System.out.println(now);System.out.println(now.getYear());System.out.println(now.getMonthValue());//直接获取月份的值System.out.println(now.getDayOfMonth());System.out.println(now.getHour());System.out.println(now.getMinute());System.out.println(now.getSecond());输出:
2020-04-03T10:25:29.906
2020
4
3
10
25
29
  • of()传入指定的日期和时间

c488b89ea79cb114e1f560741d3df4d9.png
  • 对时间进行偏移量计算

d1ffa772d0bd0f2b7e1d500cbf4df7d7.png
  • 对事件进行偏移量运算

1c89b4fb93d5ed7fd2d6e9b268794505.png
  • 当前时间与另一个时间的比较

3d6e4af2f4fb51736de8a4cc6488bfb7.png
  • 将月份天数,年份天数,月份等修改为指定的值,返回一个新的LocalDateTime对象

bb2452171d39a544c06f4b591bb812a1.png
  • get方法

2f519ec68ae46f0cd3fca67702480683.png
  • format(DateTimeFormatter formatter)对日期进行格式化
  • until返回两个日期之间的Period对象
  • isLeapYear判断是否为闰年

2.2 Instant时间戳

Unix元年(传统设定为UTC时区1970年1月1日)开始所经历的描述进行运算

  • 获取当前时间的时间戳toEpochMilli
  • 获取当前时间的秒getEpochSecond
  • 对时间进行偏移Instant.now().ofHours(ZoneOffset.ofHours(int hours))

2.3 TemporalAdjuster 时间校正器

主要通过TemporalAdjusters工具类获取到TemporalAdjuster实例对象

LocalDateTime now = LocalDateTime.now();//直接调用JDK提供的时间校正器LocalDateTime with = now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));System.out.println(with);//自定义一个时间校正器,计算下一个工作日LocalDateTime with2 = now.with(e -> {LocalDateTime e1 = (LocalDateTime) e;DayOfWeek dayOfWeek = e1.getDayOfWeek();if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {return e1.plusDays(3);} else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {return e1.plusDays(2);} else {return e1.plusDays(1);}});System.out.println(with2);

2.4 DateTimeFormatter日期格式化

三种格式化方法:

  • 预定义的标准格式
  • 语言环境相关的格式
  • 自定义的格式

2.4.1 预定义的标准格式

JDK提供的格式化格式

daa27ad07f6bc92447d7a21607bbc37d.png
LocalDate localDate = LocalDate.now();
String format = localDate.format(DateTimeFormatter.ISO_DATE);
输出:2020-04-03

2.4.1 自定义的时间格式

//自定义日期格式化方式,可以通过format和parse对日期进行格式化
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String format1 = localDate.format(dateTimeFormatter);
System.out.println(format1);
localDate.parse(format1,dateTimeFormatter);输出:2020年04月03日2020-04-03

2.5 时区处理

2.5.1 ZoneId

  • 获取所有的时区信息
 Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
  • 获取指定时区信息的ZoneId对象
ZoneId of = ZoneId.of("Asia/Chungking");

2.5.2 ZonedDateTime

获取一个带时区的日期时间对象

ZonedDateTime now = ZonedDateTime.now();System.out.println(now);
//输出
2020-04-03T14:22:54.250+08:00[Asia/Shanghai]

其他用法和LocalDateTime类相同

7000字长文带你深入IOC加载流程​mp.weixin.qq.com
a29d41b142f5df33cc48b3279d68c43d.png
SpringMVC的执行流程,你想知道的都有​mp.weixin.qq.com

8bd4467de29529bcd0461a4a14c312cf.png

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

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

相关文章

存储ic载板_延伸IC领域 崇达技术拟将持有普诺威55%股权

立即加星标每天看好文PCB网城讯崇达技术7月1日公告&#xff0c;6月30日&#xff0c;崇达技术股份有限公司(以下简称“崇达技术”)与朱小红、马洪伟在公司会议室签署了《关于江苏普诺威电子股份有限公司之股份转让协议》(以下简称“协议”)。根据协议&#xff0c;公司拟以自有资…

微云服务器失败原因_梦幻西游:服务器发生异常?游戏出现明显卡顿感,正在排查问题...

就在刚刚&#xff0c;不少梦幻玩家都在讨论一个情况&#xff0c;那就是服务器出现了明显的卡顿感&#xff0c;一些商人也陆续掉线&#xff0c;难道是服务器出现了异常&#xff1f;退出游戏之后&#xff0c;一直无法进入&#xff0c;登录界面总是停留在"正在连接某某服务器…

maven多模块项目部署到服务器,GitHub - baxias/foweb: 一个基于 Spring+SpringMVC+Mybatis 的Maven多模块项目。(实现前后端分离的服务器端)...

Foweb FrameworkA multi-modules maven project base on SpringSpringMVCMybatis.一个基于 SpringSpringMVCMybatis 的Maven多模块项目。使用文档两种使用方式&#xff1a;1. 直接将项目download下来&#xff0c;然后在IDE(Eclipse或者IDEA)中以maven项目导入&#xff0c;注意这…

网站需要数据库服务器吗,网站需要独立的服务器数据库吗

网站需要独立的服务器数据库吗 内容精选换一换文档数据库服务提供使用数据管理服务(Data Admin Service&#xff0c;简称DAS)、内网和公网的连接方式。文档数据库服务默认为您开通了远程主机登录权限&#xff0c;推荐您使用更安全便捷的数据管理服务连接实例&#xff0c;具体请…

只提取单元格中的数字_提取Excel单元格中的数字(4类)及原理

文中总结了4类从包含有中文、字母、数字的单元格数据中只提取数字的公式。(使用的时候把单元格名称改为实际的单元格名称即可)。1.提取文本左侧数据当单元格中数字在左侧&#xff0c;文字内容在右侧时&#xff0c;我们可以使用一下公式来将数字快速提取出来。函数公式&#xff…

delphi 执行长时间存储过程 显示进度_项目管理_十大管理体系之「项目进度管理」知识整理及心得分享...

项目进度管理项目进度管理在项目是项目管理三大要素之一&#xff0c;在项目管理中占有非常重要的地位。往往很多项目要求进度节点是一个固定期限&#xff0c;无法修改&#xff0c;所以进度把控就显得尤为重要。什么是进度管理&#xff0c;在你写project项目计划时就非常清楚的可…

bettertouchtool闪退_BetterTouchTool for Mac 3.238 无闪退 触控板增强工具

BetterTouchTool为魔术鼠标添加了许多新的完全可自定义的手势&#xff0c;Multi-Touch MacBook触控板和Magic Trackpad。这些手势是可定制的&#xff1a;魔术鼠标&#xff1a;捏合/缩小(缩放)单指点击左边单指轻拍右键单指中间单指轻拍单指点击中间双指轻敲双指点击双指轻扫(上…

宝塔php扩展fil_宝塔面板安装Redis给WordPress网站加速优化教程

宝塔面板php安装redis缓存以加快WordPress的开启速度&#xff0c;因为WordPress打开速度慢&#xff0c;所以霜天 seo使用多种方式来提高wordpress的加载速度&#xff0c;其中一个好办法是&#xff1a;使用redis加速缓存。本文的主题是宝塔面板php安装redis缓存加速WordPress&am…

常量缓存与integer比较_Integer缓存范围到底是多少?

本文主要大致思路为&#xff1a;不管从工作中还是面试&#xff0c;这篇文章都应该好好看完&#xff0c;本人认为是非常有用的。案例Integer是基本类型int的封装类。平时不管是入坑多年的小伙伴还在入坑路上的小伙伴&#xff0c;都应该知道的使用频率是相当高。下面模仿订单支付…

supervisor 子进程退出_用supervisor监管你的程序,不用担心程序挂了

1.背景无论多么优秀的程序员都难以避免写出来的程序会有崩溃的一天&#xff0c;特别是c、c这种高技术含量的语言&#xff0c;一不小心就来个段错误&#xff08;segment fault&#xff09;,我们通常会写一个守护进程或者守护脚本&#xff0c;检测对应的进程是否退出&#xff0c;…

pta7-3 统计不及格人数_应用统计专硕院校专业难度分析【青岛大学、苏大、西安交通大学】...

原文链接&#xff1a;应用统计专硕院校专业难度分析【第十二期】​mp.weixin.qq.com应用统计专硕院校专业难度分析 【第十二期】TO&#xff1a;哈喽&#xff0c;小可爱们早上给你好呀&#xff01;今天安安姐给你们更新经济类6个专硕院校专业难度分析专题第十二期&#xff0c;大…

mysql数据库事务有几种特性_面试官:你能说说事务的几个特性是啥?有哪几种隔离级别?...

1、面试题事务的几个特点是什么&#xff1f;数据库事务有哪些隔离级别&#xff1f;MySQL的默认隔离级别&#xff1f;2、面试官心里分析用mysql开发的三个基本面&#xff1a;存储引擎、索引&#xff0c;然后就是事务&#xff0c;你必须得用事务。因为一个业务系统里&#xff0c;…

latex 图片大小_用LaTeX写作业——插入图片(二)

&#xfeff;方法 subfigure可以横向排列一组图片&#xff0c;会自动编号abcd。在一个 subfigure内使用minipage插入图片&#xff0c;通过控制图片大小实现换行效果 # 效果 代码usepackage{subfigure} %所需宏包 usepackage{graphicx}begin{figure}[htbp] centersubfigure[标题…

python中单例模式是什么_python中的单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式&#xff0c;该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中&#xff0c;某个类只能出现一个实例时&#xff0c;单例对象就能派上用场。比如&#xff0c;某个服务器程序的配置信息存放在一个文件中…

java rsa算法_求RSA算法JAVA实现源代码(带界面的)

展开全部import javax.crypto.Cipher;import java.security.*;import java.security.spec.RSAPublicKeySpec;import java.security.spec.RSAPrivateKeySpec;import java.security.spec.InvalidKeySpecException;import java.security.interfaces.RSAPrivateKey;import java.sec…

java string值传递_String是值传递还是引用传递

string中的坑最近看到一道关于string的面试题&#xff0c;差点让我以为string是值传递&#xff0c;就是下面这个例子&#xff0c;体验下&#xff1a;public class demo{public static void main(string[] args) {demo d new demo();string str "bea";d.change(str)…

java切换jdk版本_切换JDK版本quick

最近遇到一个小问题&#xff0c;同时做两个项目&#xff0c;jdk版本一个是5&#xff0c;一个是6&#xff0c;我也去网上找了找方法&#xff0c;但是感觉不是特别好用&#xff0c;最后自己通过一些环境变量设置的技巧和一些批处理命令来使得这件事情只需要双击&#xff0c;输入一…

Linux下导出MySQL为SQL文件_MySQL导入导出.sql文件步骤

MySQL导入导出.sql文件步骤如下&#xff1a;一.MySQL的命令行模式的设置&#xff1a;桌面->我的电脑->属性->环境变量->新建->PATH“&#xff1b;path\mysql\bin;”其中path为MySQL的安装路径。二.简单的介绍一下命令行进入MySQL的方法&#xff1a;1.C:\>mys…

java 对象视图框架_Stripes视图框架Java对象属性验证和prototype.js Ajax的测试

Stripes视图框架Java对象属性验证&#xff0c;它允许对字段设置是否必须填写&#xff0c;对数字大小进行限制等。我用prototype.js Ajax 将验证后的数据及时地展示出来&#xff0c;下面来看程序。1、编写User实体类此用户共三个属性&#xff1a; name、email、age.package com.…