Java 各种时间日期相关的操作
目录
1.1、时间进制
1.2、获取毫秒级时间戳
1.3、获取纳秒级时间戳
2.1、Data
2.2、Calendar
3.1、LocalDate
3.2、LocalTime
3.3、LocalDateTime
3.4、Clock
3.5、Instant
4、日期时间格式
4.1、简单示例
4.2、常用格式转换
5、月份对应的英文
前言
平常会遇到很多的日期格式,各种各样的,什么UTC、GMT、毫秒级、微秒级、纳秒级....这些格式,怎么创建这些格式很简单,但是,怎么将这几种格式进行相互转换,是一个问题!!!!所以我专门写一篇博客,做一下笔记吧,反正经常会用到。
1、获取当前时间的时间戳
1.1、时间进制
1秒=1000毫秒
1秒=1000000微秒(1毫秒=1000微秒)
1秒=1000000000纳秒(1微秒=1000纳秒) ( 1毫秒=1000000纳秒)
要获得秒级时间戳,可以使用毫秒级时间戳除以1000即可。
1.2、获取毫秒时间戳
获取毫秒时间戳的方式比较多,一般都是用System.currentTimeMillis()。
@Test
public void testTimeStamp() { // 获得当前时间的时间戳(13位),单位是毫秒
// 方式1
long timeStamp1 = System.currentTimeMillis(); // 方式2
Date date = new Date();
long timeStamp2 = date.getTime(); // 方式3
Calendar calendar = Calendar.getInstance();
long timeStamp3 = calendar.getTimeInMillis(); // 方法4
Clock clock = Clock.systemUTC();
long timeStamp4 = clock.millis(); // 打印时间戳示例
String str = String.format("%s %s %s %s", timeStamp1, timeStamp2, timeStamp3, timeStamp4);
System.out.println(str);
// 1567942696718 1567942696718 1567942696728 1567942696731
}
1.3、获取纳秒时间戳
纳秒时间戳,好像用的不是特别多
System.out.println(System.nanoTime());
2、java.util包
2.1、Date
之所以使用java.util.Date指明Date类的包为java.util,是因为java.sql包中也有一个Date类。
Date类的输出格式:Sun Sep 08 17:49:50 CST 2019
Date类有很多方法都被废弃了,包括构造方法,所以常用的使用方法如下:
@Test
public void testDete() {
// 利用当前时间戳创建的Date实例,底层调用System.currentTimeMillis()
Date date1 = new Date();
System.out.println(date1); // Sun Sep 08 17:49:50 CST 2019 // 利用一个时间戳来创建Date对象(时间戳转Date对象)
long timeStamp = System.currentTimeMillis() - 100; // 当前时间的100秒前
Date date2 = new Date(timeStamp); // Date的compareTo,用于比较两个时间的先后
int flag = date1.compareTo(date2);
// date1.compareTo(date2)返回值分三种情况
// flag = 0, 两个时间相同(时间戳相同)
// flag = 1, date1 要晚于 date2(date1的时间戳大于date2的时间戳)
// flag = -1,date1 要早于 date2(date1的时间戳小于于date2的时间戳) // 判断date1是否晚于date2
boolean after = date1.after(date2); // 判断date1是否早于date2
boolean before = date1.before(date2); // 获取date对象的时间戳(13位),毫秒
timeStamp = date1.getTime(); // 设置date对象的时间戳
date1.setTime(timeStamp);
}
建议不要使用Date类的废弃的API,有一个Date.getMonth()获取月份,是从0开始计数,也就是说,5月份,getMonth()的值是4。
3.2、Calendar
Calendar是一个抽象类,所以不能实例化,但是可以调用getInstance()静态方法获得Calendar实例。
@Test
public void testCalender() {
// 调用静态方法获取Calendar实例(使用默认的TimeZone和Locale)
Calendar calendar1 = Calendar.getInstance(); // 获取时间戳(13位),毫秒
long timeStamp = calendar1.getTimeInMillis(); // 获取Date对象
Date date1 = calendar1.getTime(); // 设置时间
Date date2 = new Date(System.currentTimeMillis() - 100);
calendar1.setTime(date2); // 获取Calendar的字段值(比如YEAR、MONTH....)
final int month = calendar1.get(Calendar.MONTH);
System.out.println(month); // 注意,month从0开始计算,9月返回8 // 修改时间(为指定字段进行计算)
calendar1.add(Calendar.YEAR, -1); // 当前是2019年,这里将年份减1
System.out.println(calendar1.get(Calendar.YEAR)); // 2018
// 其他字段,比如月、天、时分秒的计算都是一样的做法 // 获取某个字段的最大值(同样可以有对应的接口获取最小值)
int maxDay = calendar1.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(maxDay); // 2018年9月,最多有30天 Calendar calendar2 = Calendar.getInstance(); // 设置指定字段值,注意,月份是从0开始计数
calendar2.set(Calendar.YEAR, 2030); // 设置年月日
calendar2.set(2029, 11, 5);
System.out.println(calendar2.getTime());
// Wed Dec 05 18:06:30 CST 2029 // 设置年月日时分秒
calendar2.set(2030,10, 4, 12, 58, 59);
}
3、java.time包的类
3.1、LocalDate
LocalDate可以说使用的比较多了,因为可以比较方便的获取、设置、修改日期,需要注意的是,LocalDate,从名称上就能看出,这是获取“本地”日期。
@Test
public void testLocalDate() {
// 创建LocalDate对象
LocalDate localDate = LocalDate.now();
System.out.println(localDate); // 2019-09-08 final LocalDate localDate2 = localDate.minusDays(5);
System.out.println(localDate); // 2019-09-08 注意,并不会直接修改LocalDate对象
System.out.println(localDate2); //2019-09-03 // getXxxx获取年月日信息
final int dayOfMonth = localDate.getDayOfMonth();
System.out.println(dayOfMonth); // 设置时间为2019-11-20,月份从1开始
LocalDate localDate3 = LocalDate.of(2019, 11, 20);
System.out.println(localDate3); // 2019-11-20 // 2019年的第100天
LocalDate localDate4 = LocalDate.ofYearDay(2019, 100);
System.out.println(localDate4); // 2019-04-10 // 可以调用LocalData的minusXxx、plusXxx进行日期的计算,getXxx获取某项值
}
3.2、LocalTime
LocalTime,主要是对Time,也就是对时间的操作,并且是本地的时间
@Test
public void testLocalTime() {
// 利用当前时间,创建LocalTime对象
LocalTime localTime1 = LocalTime.now();
System.out.println(localTime1); // 18:59:31.848 // 指定时-分,创建LocalTime对象,注意,小时范围为0-23
LocalTime localTime2 = LocalTime.of(23, 59);
System.out.println(localTime2); // 23:59 注意,输出没有秒数 // 指定时-分-秒,创建LocalTime对象
LocalTime localTime3 = LocalTime.of(12, 35, 40);
System.out.println(localTime3); // 12:35:40 // 额外指定纳秒
LocalTime localTime4 = LocalTime.of(13, 20, 55, 1000);
System.out.println(localTime4); // 指定一天中的第1000秒来创建LocalTime对象
LocalTime localTime5 = LocalTime.ofSecondOfDay(1000);
System.out.println(localTime5); // 00:16:40 // 利用一天中的纳秒数来创建LocalTime对象
LocalTime localTime6 = LocalTime.ofNanoOfDay(100000000);
System.out.println(localTime6); // 00:00:00.100 // 可以调用LocalTime的plusXxx,minusXxx进行时间计算,getXxx获取某项值
}
3.3、LocalDateTime
聪明的你,一定知道LocalDateTime其实就是LocalDate和LocalTime加在一起的类了,使用方式也是一样的。
@Test
public void testLocalDateTime() {
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // 2019-09-08T19:16:03.884 // 利用LocalDate和LocalTime创建LocalDateTime实例
LocalDateTime localDateTime1 = LocalDateTime.of(LocalDate.now(), LocalTime.now());
System.out.println(localDateTime1); // 2019-09-08T19:18:36.934 // of用法和LocalDate和LocalTime的of用法一样,综合在一起了而已
LocalDateTime localDateTime2 = LocalDateTime.of(2019, 5, 30, 12, 50, 45);
System.out.println(localDateTime2); // 2019-05-30T12:50:45 // 可以调用LocalDateTime的minusXxx,plusXxx来进行日期和时间的操作,使用getXxx获取某个项的值
}
3.4、Clock
Clock,时钟,用法如下:
@Test
public void testClock() {
Clock clock = Clock.systemUTC(); // 获取时区
final ZoneId zone = clock.getZone();
System.out.println(zone); // Z // 获取时间戳(13位),毫秒
long timeStamp = clock.millis();
System.out.println(timeStamp); // 1567942442222
}
3.5、Instant
Instant基本没用过(对于我而言)
@Test
public void testInstant() {
Instant instant = Instant.now();
System.out.println(instant); // 2019-09-08T11:39:29.194Z final Instant parse = Instant.parse("2019-09-08T11:39:29.109000000Z");
System.out.println(parse); // 2019-09-08T11:39:29.109Z // 可以调用plusXxx,minusXxx进行时间计算
}
4、日期时间格式
日期时间格式,可以使用SimpleDateFormat类进行自定义设置;
4.1、简单示例
@Test
public void testSimpleDateFormat() {
Date date = new Date();
System.out.println(date); // Sun Sep 08 19:49:57 CST 2019 // 创建想要显示的格式
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
final String dateStr = formatter.format(date);
System.out.println(dateStr); // 2019-09-08 19:49:57
}
4.1、常用格式转换
格式有很多种,业务不同,时间的格式也是不同的,但是可以掌握一下规律
/**
* 将UTC时间进行转换
* 比如 2019-09-08T19:49:57Z
* 2019-09-08T19:49:57.100Z
* 2019-09-08T19:49:57.100000000Z
* 2019-09-08T19:49:57.100000000 CST
* 转换为
* 2019-09-08 19:49:57
*/
@Test
public void parse1() { // 要解析的时间字符串
String src = "2019-09-08T19:49:57.100000000Z CST"; // 解析日期时,下面这个格式是通用的
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); // 目标格式
SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date = formatter1.parse(src);
String dateStr = formatter2.format(date);
System.out.println(dateStr); // 2019-09-08 19:49:57
} catch (ParseException e) {
e.printStackTrace();
}
}
/**
* 生成GMT格式的时间:Thu, 15 Sep 2011 12:13:41 GMT
*/
@Test
public void testToGMT() {
SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
String str = formatter.format(new Date());
System.out.println(str); // Sun, 08 Sep 2019 23:01:35 GMT
}
/**
* 时间计算
*
* @param datatime 字符串形式的日期时间,比如2019-10-09 20:03:00
* @param seconds 增减多少秒
* @return
*/
public String computeDateTime(String datatime, int seconds) {
if (seconds == 0) {
return datatime;
} SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = formatter.parse("2019-10-09 20:03:00");
long resMillSecond = date.getTime() + seconds * 1000;
return formatter.format(new Date(resMillSecond));
} catch (ParseException e) {
e.printStackTrace();
} return datatime;
} public void testTime() throws ParseException {
System.out.println(computeDateTime("2018-10-09 20:03:00", 4)); // 2018-10-09 20:02:56
System.out.println(computeDateTime("2018-10-09 20:03:00", -4)); // 2018-10-09 20:03:04
}
5、月份对应的英文
| 月份 | 英文 |
| 1月 | January |
| 2月 | February |
| 3月 | march |
| 4月 | April |
| 5月 | May |
| 6月 | June |
| 7月 | July |
| 8月 | August |
| 9月 | September |
| 10月 | October |
| 11月 | November |
| 12月 | December |
Java 各种时间日期相关的操作的更多相关文章
- Java 8 时间日期库的20个使用示例
java 8是如何处理时间及日期的 有人问我学习一个新库的最佳途径是什么?我的回答是,就是在实际项目中那样去使用它.在一个真实的项目中会有各种各样的需求,这会促使开发人员去探索和研究这个新库.简言之, ...
- Java 8 时间日期库的20个使用演示样例
除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务演示样例来学习怎样使用Java 8的这套API.Java对日 ...
- Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题
LocalDate.LocalTime.LocalDateTime是Java 8开始提供的时间日期API,主要用来优化Java 8以前对于时间日期的处理操作.然而,我们在使用Spring Boot或使 ...
- Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题【转】
Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题 http://blog.didispace.com/Spring-Boot-And-Feign- ...
- JAVA格式化时间日期
JAVA格式化时间日期 import java.util.Date; import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL = 0 * ...
- Java基础 与时间日期相关的类:System -Date -SimpleDateFormat -Calendar类 -解决后缀.000Z 的时区问题
笔记总结: /**与时间相关的类:System_Date_SimpleDateFormat_Calendar类 * 1.system 类下的currentTimeMillis() * 输出从1970年 ...
- java开源时间/日期库Joda-Time
任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完成这项任务将非常痛苦和繁琐.现在来看看 Joda Time,一 ...
- Java工具类——日期相关的类
前言 在日常的开发工作当中,我们经常需要用到日期相关的类(包括日期类已经处理日期的类),所以,我就专门整理了一篇关于日期相关的类,希望可以帮助到大家. 正文 一.日期类介绍 在 Java 里面,操作日 ...
- Java中时间日期格式化
1.与日期时间相关的类: 第一:java.util.Date; 将时间作为一个整体使用.处理时,使用Date类较为简便 第二:j ...
随机推荐
- php命令模式(command pattern)
... <?php /* The command pattern decouples the object that executes certain operations from objec ...
- Python中取整的方法floor,ceil,round
地板函数:math.floor(4.9)=4 天花板函数: math.ceil(4.1)=5 四舍五入: round(4.5)=4 round(4.6)=5
- loadrunner中web_submit_data与web_submit_form区别
以loadrunner自带的订票系统为例 当选择红框选中的模式时,所录脚本如下:回放时可以正常回放,登录成功 选另一种所录脚本如下:回放时登录不成功,session失效, 其中web_submit_f ...
- Vue工程化之引入element-ui框架后图标失效
场景: vue-cli搭建的工程化项目,引入element框架后发现图标无效,变为方块 解决方案: 在index.html引入样式文件CDN链接即可 <!-- 引入样式 --> <l ...
- 一些坑 Java 执行命令行命令 Spring Boot 打包为jar ResourceUtils.getFile 等出现的问题
Java 执行命令行命令 这个没技术含量的东西耗费了我半个多小时 String command = ....; Process process = Runtime.getRuntime().exec( ...
- Xamarin.Forms快速入门-深入探讨
官网链接 项目介绍 以Notes项目为例,The Notes application consists of one solution containing four projects, as sho ...
- JS的ES6的Symbol
一.Symbol 1.什么是Symbol: Symbol是ES6新添加的原始类型(ES5已有原始数据类型:String,Number,boolean,function,undefined,object ...
- 洛谷P2038 无线网络发射器选址
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的 \(129\) 条东西向街道和 \(129\) 条南北向街道所形 ...
- Macbook Pro升级10.15后百度网盘无法登陆,网络连接错误(-1001)
兴冲冲升级到10.15,结果百度网盘挂了~QQ 由于长期在境外实验室做研究,百度又封锁了境外登陆,所以客户端是唯一跟家里联络的方式,现在它也挂了感觉整个天都塌下来了. 找了一圈,发现一个特别神奇的解锁 ...
- 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量
P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...