文章目录
1. 格式化日期和时间使用 DateTimeFormatter(Java8)
提示:在讲时间获取之前,我们先了解下格式化日期和时间的类 DateTimeFormatter 和 SimpleDateFormat
首先说明:请优先使用 DateTimeFormatter !具体代码实现可看末尾小结。原因如下:
-
具有线程安全性:DateTimeFormatter 是线程安全的, SimpleDateFormat 非线程安全。
-
类型支持多:DateTimeFormatter 支持多种日期和时间类型,例如 LocalDate、LocalTime、LocalDateTime等。SimpleDateFormat 只支持 Date 类型。
-
解析能力强:DateTimeFormatter 可以将字符串解析为日期和时间类型, SimpleDateFormat 不支持解析。
-
本地化支持:DateTimeFormatter 支持本地化。SimpleDateFormat 虽然也支持本地化,但使用起来相对麻烦。
更多详情对比可参照:链接
2. 获取当前日期的方法
单纯查询用法可直接跳到最后 Java8 的TimeAPI的方法,优先推荐使用。
2.1 System.currentTimeMillis()
此方法会根据我们的系统时间返回当前值。这是基于底层的api,但是实际开发中谨慎使用,不管是单线程还是多线程下,在高并发下高频的调用System.currentTimeMillis()都会产生延迟,需要更深层次的处理。
System.out.println("currentTimeMillis=="+System.currentTimeMillis());
// 看输出可知此方法输出的是时间戳,所以需要转化
Date date1 = new Date(System.currentTimeMillis());
// 格式化时间工具类
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("currentTime=="+formatter.format(date1));
currentTimeMillis==1712542238241
currentTime==2024-04-08 10:10:38
2.2 java.util.Date
获取当前日期最简单的方法之一就是直接实例化位于 Java 包 java.util 的 Date 类。
Date date2 = new Date();
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Date=="+formatter.format(date2));
Date==2024-04-08 10:25:40
也可以直接简化为一行代码:
String testDate2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date2);
这里其实就能明显看出,结果是字符串,如果我们要年月信息的话,可以截取:
System.out.println("年月=="+testDate2.substring(0,4)+"年"+testDate2.substring(5,7)+"月");
年月==2024年04月
2.3 Calendar API
还有没有更优雅的获取年月的方法呢?
Calendar 类,专门用于转换特定时刻和日历字段之间的日期和时间。
使用 Calendar 获取当前日期和时间非常简单:
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
System.out.println("当前年份:" + year);
int month = cal.get(Calendar.MONTH);
System.out.println("当前月份:"+month);
System.out.println("当前时间:"+cal.getTime());
当前年份:2024
当前月份:3
当前时间:Mon Apr 08 10:36:12 CST 2024
2.4 Java8 的 Time API(优先使用,重要!)
提示:最后,我们讲讲本篇的重点, JAVA 8 提供的Time API
Java 8 提供了一个全新的 API,用以替换 java.util.Date 和 java.util.Calendar。Date / Time API 提供了多个类,帮助我们来完成工作,包括:
LocalDate ----- LocalTime ----- LocalDateTime ----- ZonedDateTime
为何要用 Java 8 的新API?
线程安全 - Date 和Calendar类不是线程安全的,使开发者难以调试这些api的并发问题,需要编写额外的代码来处理线程安全。Java 8中引入的新的Date和Time API是不可变的和线程安全的,使得这些痛点得以解决。
API设计和易于理解 - 旧的时间api非常难以理解,操作都非常复杂,非常绕口,没有提供一些常用的解析转换方法。新的时间API是以ISO为中心的,并遵循 date, time, duration 和 periods的一致域模型。提供了一些非常实用方法以支持最常见的操作。不再需要我们自己封装一些时间操作类。
ZonedDate和Time - 在旧的时间api中开发人员必须编写额外的逻辑来处理旧API的时区逻辑,而使用新的API,可以使用 Local和ZonedDate / Time API来处理时区。无需过多关心时区转换问题。
最常用的类是LocalDate(只有日期),LocalTime(只有时间)和LocalDateTime(日期时间都有)。正如他们的名字所示,它们代表与上下文相结合的本地日期/时间。
LocalDate(第4点求闰年)
LocalDate表示在ISO格式(YYYY-MM-DD)下的不带具体时间的日期。
LocalDate localDate = LocalDate.now();
System.out.println("localDate==="+localDate.getYear());
localDate===2024
也可以指定日期年月日,使用“ of ”方法或使用“ parse ”方法获得:
LocalDate localDate1 = LocalDate.of(2015, 02, 20);
LocalDate localDate2 = LocalDate.parse("2015-02-20");
System.out.println("localDate1==="+localDate1);
System.out.println("localDate2==="+localDate2);
localDate1===2015-02-20
localDate2===2015-02-20
是不是非常直观而且方便!LocalDate还提供各种实用方法,以获得各种日期信息。让我们快速浏览一下这些API方法:
- 获取当前本地日期并添加一天:
LocalDate tomorrow = LocalDate.now().plusDays(1);
System.out.println("tomorrow==="+tomorrow);
tomorrow===2024-04-09
- 获取当前日期并减去一个月。请注意它是如何接受枚举作为时间单位的:
LocalDate lastMonthSameDay= LocalDate.now().minus(1, ChronoUnit.MONTHS);
System.out.println("lastMonthSameDay==="+lastMonthSameDay);
previousMonthSameDay===2024-03-08
- 分别获取星期几和月中的某天。注意返回值
DayOfWeek weekday = LocalDate.parse("2024-04-08").getDayOfWeek();
int eight = LocalDate.parse("2024-04-08").getDayOfMonth();
System.out.println("weekday===="+weekday+'\n'+"eight==="+eight);
weekday====MONDAY
eight===8
- 们可以测试一个日期是否发生在闰年,非常简单!一行搞定,如果用老方法怕不是要上天
boolean leapYear = LocalDate.now().isLeapYear();
// 当然也可以指定日期
boolean leapYear2 = LocalDate.parse("2027-04-08").isLeapYear();
- 获取日期边界,给定日期的开始时间 LocalDateTime 和代表月初的 LocalDate
LocalDateTime beginningOfDay = LocalDate.parse("2024-04-08").atStartOfDay();
LocalDate firstDayOfMonth = LocalDate.parse("2024-04-08")
.with(TemporalAdjusters.firstDayOfMonth());
System.out.println("beginningOfDay===="+beginningOfDay+'\n'+"firstDayOfMonth==="+firstDayOfMonth);
beginningOfDay====2024-04-08T00:00
firstDayOfMonth===2024-04-01
- 判断日期的先后:
boolean notBefore = LocalDate.parse("2016-06-12").isBefore(LocalDate.parse("2016-06-11"));
boolean isAfter = LocalDate.parse("2016-06-12").isAfter(LocalDate.parse("2016-06-11"));
怎么样,是不是非常的方便,真的非常不错
标签:System,parse,日期,API,DateTimeFormatter,LocalDateTime,LocalDate,Java8,LocalTime From: https://blog.csdn.net/weixin_44144455/article/details/137492814