玩转Java8日期工具类-基础
内容基于的是 Java8官方文档,以及Java时间类总结 的总结。BTW:其实具体方法的使用直接在IDEA中看源码更方便直接。
1.老一辈:Java.util.Date Java.sql.Date Java.util.Calendar
1.1 Java.util.Date
最经典的表示时间的类,包含年月日时分秒,精确到毫秒级别,保留两个没被废弃的构造方法
Date nowDate = new Date();
System.out.println("现在时间: " + nowDate);
//结果打印当前时间 “现在时间: Sat Aug 14 17:38:49 CST 2021”
//上面其实是返回了此时毫秒时间最接近的秒时间
long nowDateMS = nowDate.getTime();
//填入long类型的 January 1, 1970, 00:00:00 GMT到某个时间的毫秒数
Date nowDatePlus1000s = new Date(nowDateMS + 1000*1000);
System.out.println(nowDatePlus1000s);
//结果是: "Sat Aug 14 17:55:29 CST 2021"
常用方法:
//返回该时间点到January 1, 1970, 00:00:00 GMT的毫秒数
date.getTime()
//判断两个时间的前后,返回值为int类,前者早于后者返回-1;等则为0,晚则为1
date.compareTo(Date anotherDate)
//判断两个时间的前后,返回值为boolean,通过比较距离1970那个时间的毫秒数的大小判断
date.before(Date anotherDate)
date.after(Date anotherDate)
Date类型借助 java.text.SimpleDateFormat 实现格式化,返回值是 String。同时也逆向解析字符串对应的字符串,返回Date类,但是要保持格式一致,否则返回null
////格式化
SimpleDateFormat sdf12 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); // hh表示12小时制
SimpleDateFormat sdf24 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // HH表示24小时制
String date1 = sdf12.format(nowDate);
System.out.println(date1);
//结果: 2021-08-14 06:41:54
String date2 = sdf24.format(nowDate);
System.out.println(date2)
//结果: 2021-08-14 18:41:54
////解析 字符串格式必须是 "yyyy-MM-dd HH:mm:ss" 类型才可成功,也就是你是怎么转过去的,就怎么转回来,确保一一对应,否则返回null
Date date3 = sdf24.parse(date2, new ParsePosition(0)); // ParsePosition(0) 表示解析全部的字符串。
1.2 Java.sql.Date
java.sql.Date extends java.util.Date,二者区别不大,值得注意只有毫秒的构造函数。它主要对应于SQL中的DATE类型,因此将时分秒,毫秒设置为0。不过它可以转换成 java8 中的 LocalDate类。
java.sql.Date now = new java.sql.Date(100000000);
System.out.println(now);
//结果:1970-01-02
LocalDate date4 = now.toLocalDate();
System.out.println(date4);
java.sql.Time 对应SQL中的 TIME类型
java.sql.Time nowTime = new java.sql.Time(1000000000);
System.out.println(nowTime);
//结果:21:46:40
java.sql.Timestamp sql时间戳,对应于SQL中的TIMESTAMP类,精确到纳秒级
java.sql.Timestamp nowTimestamp = new java.sql.Timestamp(1000000000);
System.out.println(nowTimestamp);
//结果:1970-01-12 21:46:40.0
1.3 java.util.Calendar
java.util.Calendar是一个抽象类,能够存储 年月日时分秒,同时实现加减乘除。但是其主要作用于包含丰富灵活的方法实现对日期,包括年、月、日和星期的互相转换,比如想知道某年某月最后一天的日期是多少,以及今年有多少周。
BTW:在Calendar中,一周从 SUNDAY 开始到 SATURDAY 结束是1~7,一年月份是从Jan 到 Dec 对应 0~11。
具体可以参考 申城异乡人-Java Calendar类使用总结
Calendar calendar = Calendar.getInstance();
Date nowDate = calendar.getTime();
//// or
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH)+1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
// 24小时制
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
在Java 1.8之后提供了三个新的时间类,localDate localTime localDateTime 分别对应日期,时间,日期+时间,三者都是final修饰,不可变类,因此线程安全。
2.1 java.time.LocalDate
localDate 保存日期,可以获取日期对应的星期,因此可以用于打印日历,参考SleeypbearZz-Java通过LocalDate类打印当前月日历。它提供了比上面更多的方法,以下列举了一些,完整参考api文档。
// 构造
LocalDate nowLocalDate = LocalDate.now();
LocalDate toDay = LocalDate.of(2021,8,15);
System.out.println("LocalDate默认时间格式是: " + nowLD);
System.out.println(nowLD.getDayOfWeek() + " + " + nowLD.getMonthValue() + " + " + + nowLD.getDayOfYear());
//设置,其他不变,只改变对应的月,年。
System.out.println(nowLD.withMonth(2) + " + " + nowLD.withYear(2019));
// 增加
System.out.println(nowLD.plusDays(1) + " + " + nowLD.plusWeeks(1) + " + " + nowLD.plusMonths(1) + " + " + nowLD.plusYears(1));
//减少
System.out.println(nowLD.minusDays(1) + " + " + nowLD.minusWeeks(1) + " + " + nowLD.minusMonths(1) + " + " + nowLD.minusYears(1));
//还提供了计算两个时间点的时间差 until相关方法,复杂了一些,以后有时间再研究
2.2 java.time.localTime
localTime 参考文章 ZetCode-Java LocalTime。总结有一下的内容:
LocalTime 只保存时间,精确到纳秒,基本上LocalDate有的,它也都有,同时它的 until()方法使用简单,用于计算两个时间点之间的时间差,但是要切忌隔天计算。
LocalTime nowLocalTime = LocalTime.now();
System.out.println("LocalTime默认时间格式是: " + nowLocalTime);
// 结果是 “LocalTime默认时间格式是: 17:50:24.438”
LocalTime t1 = LocalTime.of(8,20);
LocalTime t2 = LocalTime.of(17, 20, 45, 342123342);
LocalTime t3 = LocalTime.parse("08:20",DateTimeFormatter.ISO_TIME);
LocalTime t4 = LocalDateTime.now().toLocalTime();
LocalTime t5 = t1.plusMinutes(1).plusHours(40);
System.out.println(t5.until(t1, MINUTES));
System.out.println(MINUTES.between(t1, t5) + " + " + t5.until(t1,HOURS) + " + " + t5.until(t1,HALF_DAYS));
2.3 java.time.LocalDateTime
最后是 LocalDateTime 集合了上述两个的特性,包含了几乎全部的方法,以及向 LocalDate和 LocalTime的转换,在此就不再赘述,可以根据自己需要仔细研究,感觉你想要的,想不到的方法都具备。
总结
推荐使用Java8 Java.time.Local前缀 的时间类,原因有:
- 提供了更多灵活好用的API;
- 新版日期类库都是不可变类且线程安全。
参考:
- Java时间类总结;
- SleeypbearZz-Java通过LocalDate类打印当前月日历;
- 申城异乡人-Java Calendar类使用总结 ;
- ZetCode-Java LocalTime;
- Java8官方文档
玩转Java8日期工具类-基础的更多相关文章
- 开始使用 java8 的日期工具类
例如,现有的类(例如java.util.Date和SimpleDateFormatter)不是线程安全的,这会导致用户潜在的并发问题.而新的LocalDate.LocalDateTime.DateTi ...
- 日期工具类 - DateUtil.java
日期工具类,提供对日期的格式化和转换方法.获取区间日期.指定日期.每月最后一天等. 源码如下:(点击下载 -DateUtil.java.commons-lang-2.6.jar ) import ja ...
- JS 日期工具类-基于yDate
源码下载 前言:最近在用到JS日期操作时,发现有一些不方便,于是搜素了一些网上的资料,基于一个开源工具类-yDate 进行了个性化定制,封装成了一个日期工具类工具函数大概介绍:1.普通的日期操作2. ...
- Java日期工具类,Java时间工具类,Java时间格式化
Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>&g ...
- JAVA 8 日期工具类
JAVA 8 日期工具类 主题描述 JAVA中日期时间的历史 代码成果 主题描述 JAVA的日期时间一直比较混乱,本来以为joda会是巅峰,但是JAVA 8改变了我的思想.但是即便在JAVA 8面前, ...
- java 日期工具类DateUtils
日期工具类DateUtils CreateTime--2017年5月27日08:48:00Author:Marydon DateUtils.java-对日期类的进一步封装 import java. ...
- java日期工具类DateUtil-续一
上篇文章中,我为大家分享了下DateUtil第一版源码,但就如同文章中所说,我发现了还存在不完善的地方,所以我又做了优化和扩展. 更新日志: 1.修正当字符串日期风格为MM-dd或yyyy-MM时,若 ...
- java日期工具类DateUtil-续二
该版本是一次较大的升级,农历相比公历复杂太多(真佩服古人的智慧),虽然有规律,但涉及到的取舍.近似的感念太多,况且本身的概念就已经很多了,我在网上也是查阅了很多的资料,虽然找到一些计算的方法,但都有些 ...
- java日期工具类DateUtil
一名优秀的程序员,不仅需要有着丰富解决问题的方案,还需要的便是代码的沉淀,这不仅有助于自己快速的开发程序,也有利于保证程序的健壮.那如何才能沉淀自己的”代码“呢?从自己编写util开始其实就是一个不错 ...
随机推荐
- buu 简单注册器
一.本身对安卓逆向这块不是很熟悉,为了看这题稍微了解了一下,原来安卓虚拟机解释运行的是dex文件,和java的字节码不一样,然后是smail语法,这块我不会,所以找个了个神器来反编译2333,然后这题 ...
- 经典论文系列 | 目标检测--CornerNet & 又名 anchor boxes的缺陷
前言: 目标检测的预测框经过了滑动窗口.selective search.RPN.anchor based等一系列生成方法的发展,到18年开始,开始流行anchor free系列,CornerNe ...
- 为LInux系统安装坚果云网盘
首先 从www.jianguoyun.com/s/downloads/linux 中下载安装包(deb.rpm) deb 包安装及解决依赖方法 1. 使用 gdebi 安装,自动安装依赖 sudo g ...
- Adaptive AUTOSAR 学习笔记 6 - 架构 - 方法论和 Manifest
本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf 缩写 AP:AUTOSAR Adap ...
- 动态路由协议、RIP
动态路由协议.RIP 一.动态路由协议 1)动态路由协议概述 2)度量值 3)收敛 4)静态路由与动态路由的比较 5)动 ...
- 如何在Apache HttpClient中设置TLS版本
1.简介 Apache HttpClient是一个底层.轻量级的客户端HTTP库,用于与HTTP服务器进行通信. 在本教程中,我们将学习如何在使用HttpClient时配置支持的传输层安全(TLS)版 ...
- 短视频:用快影制作3D音乐视频
用快影制作3D音乐视频1打开快影点击开始剪辑导入一张风景照片,按住照片向后拉到自己需要的时长2点击画中画,点击新增,画中画,导入一张照片3点击模板,选择圆形,调整圆形的大小,摆放到上面合适的位置,按照 ...
- 给potplayer配置iptv源,看所有你想看的电视
目录 一.展示: 二.下载 三.播放 一.展示: 二.下载 Github 上的开源项目:iptv-org/iptv 传送门: https://github.com/iptv-org/iptv 该项目包 ...
- 【有奖互动】HMS Core. Sparkle游戏应用创新沙龙,诚邀您参与
活动简介 随着互联网基础设施的完善和"宅经济"效应凸显,游戏行业逆势上扬,迎来巨大消费市场.同时,用户需求愈加多样化,如何进一步创新和技术升级.提升核心竞争力已成为游戏开发与运营的 ...
- Spark—编译Spark源码
Spark版本:Spark-2.1.0 Hadoop版本:hadooop-2.6.0-cdh5.7.0 官方文档:http://spark.apache.org/docs/latest/buildin ...