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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了