sql两个时间计算时间差_Java 8时间类,越用越香
为什么会在Jdk8中加入很多时间类
非线程安全
java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
Date date = new Date();for (int i = 0; i < 100; i++) { new Thread(new Runnable() { @Override public void run() { // 举例 int time = new Random().nextInt(100); date.setTime(time); System.out.println( Thread.currentThread().getId() + " = " + time); System.out.println( Thread.currentThread().getId() + " = " + date.getTime()); } }).start();}
SimpleDateFormat格式化工具也是一样,阿里巴巴规约中建议将SimpleDateFormat放到ThreadLocal中。
而java8中日期和时间基本都被设计final,final修饰的类,天然线程安全。
设计很差
java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,两个类又有相同的名字,令人匪夷所思。
java.util.Date代表时间线上的一个瞬间(包含了从Unix新纪元到现在的总毫秒数),但是如果调用了Date的toString(),返回值会提示它是带着时区的,这也会让开发者感到疑惑。
时区、日期计算处理麻烦
日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题,使用复杂,不直观
// 获取当前时间日历 +8时区Calendar calendar = Calendar.getInstance();// 毫秒数calendar.setTimeInMillis(1601186434000L);// 时区转到 utc 时间calendar.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));int dstOffset = calendar.get(java.util.Calendar.DST_OFFSET);int zoneOffset = calendar.get(Calendar.ZONE_OFFSET);calendar.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset));// 时区转到对应的时区calendar.setTimeZone(TimeZone.getTimeZone("GMT+5:00"));int dstOffset1 = calendar.get(java.util.Calendar.DST_OFFSET);int zoneOffset1= calendar.get(Calendar.ZONE_OFFSET);calendar.add(java.util.Calendar.MILLISECOND, (zoneOffset1 + dstOffset1));// 时间计算calendar.add(Calendar.HOUR,15);// 日期计算calendar.add(Calendar.DAY_OF_MONTH, -1);// 时区计算calendar.add(Calendar.ZONE_OFFSET, 3);// 周几int week = calendar.get(Calendar.DAY_OF_WEEK);
基于上述的原因,java8重新提供一套时间类,下面来看一下相关类
java8 日期、时间常见类
- ZoneId 地区 Asia/Shanghai、Europe/Paris
- ZoneOffset 偏移数据 +8:00
- Instant 它代表的是时间戳
- Duration 它表示秒或纳秒时间间隔
- Period 表示一段时间的年、月、日,开使用between()方法获取两个日期之间的差作为Period 对象返回
- LocalDate 不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。
- LocalTime 它代表的是不含日期的时间
- LocalDateTime 它包含了日期及时间,不过还是没有偏移信息或者说时区。
- ZonedDateTime 这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
- OffsetDateTime 类实际上包含了LocalDateTime与ZoneOffset
- DateTimeFormatter 日期的格式化与解析,与SimpleDateFormat不同,它是不可变且线程安全的
- TemporalAdjusters 类中包含许多常用的静态方法,避免自己编写工具类
时间类关系图
![](/assets/blank.gif)
常见类的操作示例
ZoneId zoneId = ZoneId.systemDefault();System.out.println(zoneId);//Asia/ShanghaiZoneOffset zoneOffset = ZoneOffset.ofHours(8);System.out.println(zoneOffset);//+08:00Instant instant = Instant.ofEpochSecond(LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)));System.out.println(instant.getEpochSecond());//1605596559Duration duration = Duration.between(LocalDateTime.now(), LocalDateTime.now().plusHours(1));System.out.println(duration.getSeconds());//3600Period period = Period.between(LocalDate.now(),LocalDate.now().plusDays(1));System.out.println(period.getDays());//1LocalDate date = LocalDate.now();System.out.println(date);//2020-11-17LocalTime time = LocalTime.now();System.out.println(time);//15:02:39.067LocalDateTime now = LocalDateTime.now();System.out.println(now);//2020-11-17T15:02:39.06ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), zoneId);System.out.println(zonedDateTime);//2020-11-17T15:02:39.067+08:00[Asia/Shanghai]OffsetDateTime offsetDateTime = OffsetDateTime.of(LocalDateTime.now(), ZoneOffset.ofHours(8));System.out.println(offsetDateTime);//2020-11-17T15:02:39.068+08:00String format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(offsetDateTime);System.out.println(format);//2020-11-17 15:02:39TemporalAdjuster temporalAdjuster = TemporalAdjusters.firstDayOfMonth();System.out.println(temporalAdjuster.adjustInto(LocalDate.now()));//2020-11-01
特别说明
ZoneId、ZoneOffset主要表示时区和偏移
Instant 表示时间戳
Duration、Period 表示时间差,前者表示时间差,后者表示日期差
LocalDate、LocalTime、LocalDateTime表示日期、时间、日期+时间
ZonedDateTime、OffsetDateTime含时区信息的时间
Java8的方便之处
提供了很多时间、日期计算的方法,非常直观
![](/assets/blank.gif)
也提供了TemporalAdjusters这样的时间工具类,内置了一些方法。
![](/assets/blank.gif)
sql两个时间计算时间差_Java 8时间类,越用越香相关推荐
- java 比较时间时分的大小_java计算时间差及比较时间大小
java计算时间差及比较时间大小 javaz中对日期时间的处理比较多,代码中列出了3中日期时间计算差值的方法. 比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11: ...
- java计算时间差_java中计算两个时间差
java计算时间差及比较时间大小 比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方 ...
- java 时间判断大小_java判断时间大小
//构造日期格式yyyy-MM-NN SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date d ...
- js根据一个时间计算N年后的时间-计算时间demo示例
<!doctype html> <html lang="en"> <head><meta charset="UTF-8" ...
- java计算时间差_Java中计算两个日期的时间差
这篇文章将使用两个例子计算两个日期的时间差. 1.使用Java SDK. 2.使用Joda库. 1.使用Java SDK 计算两个Date之间的时间差,基本思路为把Date转换为ms(微秒),然后计算 ...
- python使用datetime获取两个时间的时间差,与时间的加减运算
设置指定日期为datatime格式:datetime(2020, 1, 1),表示2020年1月1日 设置指定的时间差:datetime.timedelta(days=2),表示两天的时间差 时间差是 ...
- linux c计算时间差值,获取时间和计算时间差的几种方法总结,时间差几种方法...
获取时间和计算时间差的几种方法总结,时间差几种方法 一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( ...
- 关于js中的时间——计算时间差等
获取当前(系统)时间: var NowDate= new Date(); // 获取当前日期时间 // 输出为: Wed May 03 2017 14:52:08 GMT+0800 (中国标准时间) ...
- java 计算周_java – Joda时间周计算推理
下面的代码演示了星期计算的有问题的joda-time实现.这种行为不是错误,而是设计决策 Joda-Time uses the ISO standard Monday to Sunday week.( ...
最新文章
- 【web安全】你的open_basedir安全吗?
- vue中axios的封装以及使用
- Polygonal-Light Shading with LTC
- 实现内、外网同时访问
- local tomcat 找不到springmvc里的包_唰唰的手撕一个简单的Spring Mvc 框架
- 微信服务号+支付+php,微信服务号发送营销红包给关注用户步骤及部分php代码
- C# const与readonly的用法和区别解析(转)
- 深度学习入门笔记(五):神经网络的学习
- google服务框架 闪退_刷入对应谷歌服务框架之后依然闪退怎么办 解决方方攻略...
- 低代码指南100方案:28高效HR如何做好面试管理,提高招聘效率?
- 概率论由相关性求数学期望和方差的公式_概率论笔记2--离散随机变量、数学期望和方差...
- Hibernate源码解析
- android应用程序耗电,Android的十大耗电量应用程序,在软件中排名第一
- 服务器协议 重发 回包 039,3情报板预置播放表、位图一览表.doc
- 联想旗下佳沃集团拟收购智利三文鱼公司Australis Seafoods S.A.
- c语言程序项目设计三角函数,《C语言及程序设计》实践参考——编制三角函数表...
- 五个“时髦”技术被判死刑
- c 语言怎么实现可视化编程,自定义编程语言的实现
- 关于论文查重的相关知识
- 数据挖掘系列(1)_Excel的数据挖掘插件安装(SQL Server 2012 office )
热门文章
- CVPR 2019 | INIT:针对实例级的图像翻译
- 经典论文复现 | ICML 2017大热论文:Wasserstein GAN
- windows/Linux 安装 MongoDB 3.6.5
- 在你的计算机上使用qr码登录,如何在Android 10上使用QR码共享您的Wi-fi凭据 | MOS86...
- pyqt 事件更新图片显示_使用PyQTamp;树莓派制作一个天气站
- 两封邮件合并转发_卖家直呼!低价订单过多,listing合并竟被亚马逊封号!
- mysql运行报错64bit_关于MySQL5.6.25在Win7 64bit下重装后无法启动的解决方法
- Java中有关clone方法的用法
- API性能优化之异步
- 白盒测试——简单分支函数测试