Java 各种时间日期相关的操作

前言

  平常会遇到很多的日期格式,各种各样的,什么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。

2.2、利用SimpleDateFormat解析日期

@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
}

2.3、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获取某项值
// 解析字符串日期
LocalDate localDate5 = LocalDate.parse("2022-12-01");
System.out.println(localDate5); // 2022-12-01
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM-dd");
LocalDate localDate6 = LocalDate.parse("2022/12-01", formatter);
System.out.println(localDate6); // 2022-12-01
}

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获取某项值
LocalTime localTime7 = LocalTime.parse("12:35:46");
System.out.println(localTime7); // 12:35:46
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH/mm!ss");
LocalTime localTime8 = LocalTime.parse("12/35!22", formatter);
System.out.println(localTime8); // 12:35:22
}

3.3、LocalDateTime

聪明的你,一定知道LocalDateTime其实就是LocalDate和LocalTime加在一起的类了,使用方式也是一样的,不过需要注意的是LocalDateTime的默认格式是年月日T时分秒,解析时默认也要按照这个格式,否则就需要强制指定格式

@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获取某个项的值
// 使用默认的格式解析,注意年月日和时分秒中间有个T,没有T会报错
LocalDateTime localDateTime3 = LocalDateTime.parse("2022-01-10T19:22:33");
System.out.println(localDateTime3); // 2022-01-10T19:22:33
// 自定义格式解析
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
LocalDateTime localDateTime4 = LocalDateTime.parse("2022/01/10 19:22:33", formatter);
System.out.println(localDateTime4);
// 将时间戳转为localDateTime
Instant instant = Instant.ofEpochMilli(new Date().getTime());
//Instant instant = Instant.ofEpochSecond() 时间戳秒
LocalDateTime localDateTime5 = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println(localDateTime5); // 2019-09-08T19:19:03.112
}

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

@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、月份对应英文

月份 英文
1月 January
2月 February
3月 march
4月 April
5月 May
6月 June
7月 July
8月 August
9月 September
10月 October
11月 November
12月 December

posted @   寻觅beyond  阅读(4908)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
返回顶部
点击右上角即可分享
微信分享提示