最新!Java8 中获取当前时间,一行代码Java判断闰年,日期处理。LocalDateTime的详细使用,DateTimeFormatter使用。

1. 格式化日期和时间使用 DateTimeFormatter(Java8)

提示:在讲时间获取之前,我们先了解下格式化日期和时间的类 DateTimeFormatter 和 SimpleDateFormat

首先说明:请优先使用 DateTimeFormatter !具体代码实现可看末尾小结。原因如下:

  1. 具有线程安全性:DateTimeFormatter 是线程安全的, SimpleDateFormat 非线程安全。

  2. 类型支持多:DateTimeFormatter 支持多种日期和时间类型,例如 LocalDate、LocalTime、LocalDateTime等。SimpleDateFormat 只支持 Date 类型。

  3. 解析能力强:DateTimeFormatter 可以将字符串解析为日期和时间类型, SimpleDateFormat 不支持解析。

  4. 本地化支持: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)+"月");
年月==202404

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方法:

  1. 获取当前本地日期并添加一天:
LocalDate tomorrow = LocalDate.now().plusDays(1);
System.out.println("tomorrow==="+tomorrow);
tomorrow===2024-04-09
  1. 获取当前日期并减去一个月。请注意它是如何接受枚举作为时间单位的:
LocalDate lastMonthSameDay= LocalDate.now().minus(1, ChronoUnit.MONTHS);
System.out.println("lastMonthSameDay==="+lastMonthSameDay);
previousMonthSameDay===2024-03-08
  1. 分别获取星期几和月中的某天。注意返回值
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
  1. 我们可以测试一个日期是否发生在闰年,非常简单!一行搞定,如果用老方法怕不是要上天
boolean leapYear = LocalDate.now().isLeapYear();
// 当然也可以指定日期
boolean leapYear2 = LocalDate.parse("2027-04-08").isLeapYear();
  1. 获取日期边界,给定日期的开始时间 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
  1. 判断日期的先后:
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"));

怎么样,是不是非常的方便,真的非常不错👍接下来我们看看LocalTime

LocalTime

LocalTime表示不带日期的时间。
与LocalDate类似,可以从系统时钟或使用“parse”和“of”方法创建LocalTime实例。快速浏览下面的一些常用API。

  1. 创建LocalTime实例
LocalTime sixThirtyByParse = LocalTime.parse("06:30");
 LocalTime sixThirtyByOf = LocalTime.of(6, 30);
  1. 使用“plus”API为其添加一小时。
LocalTime sevenThirty = LocalTime.parse("06:30").plus(1, ChronoUnit.HOURS);
  1. 各种getter方法可用于获取特定的时间单位,如小时,分钟和秒,如下所示获取小时:
int hour = LocalTime.parse("06:30").getHour();
  1. 同LocalDate一样检查特定时间是否在另一特定时间之前或之后。
boolean isbefore = LocalTime.parse("06:30").isBefore(LocalTime.parse("07:30"));
  1. 一天中的最大,最小和中午时间可以通过LocalTime类中的常量获得。
    在执行数据库查询以查找给定时间范围内的记录时,这非常有用。例如,下面的代码代表23:59:59.99
LocalTime maxTime = LocalTime.MAX;

接下来,让我们了解下LocalDateTime吧

LocalDateTime

由名称所述,LocalDateTime用于表示日期和时间的组合。
当我们需要结合日期和时间时,这是最常用的类。该类提供了各种API,我们将介绍一些最常用的API。

  1. 类似于LocalDate和LocalTime从系统时钟获取LocalDateTime的实例,以及使用工厂“of”和“parse”方法创建实例:
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30);
LocalDateTime.parse("2015-02-20T06:30:00");
  1. 有一些实用的API可以支持特定时间单位的时间运算,以下代码示例演示了“加”和“减”方法的用法。这些API的行为与LocalDate和LocalTime中的 API完全相同:
localDateTime.plusDays(1);
localDateTime.minusHours(2);
  1. Getter方法:
localDateTime.getMonth();

小结(Java 8 中轻松格式化日期和时间的API)

提示:这里可以添加总结

好了,今天写的够多了,这次的内容就先到这里,后续会提到

  1. ZonedDateTime API的使用,用于处理时区特定的日期和时间。
  2. Period和Duration,Period 用于计算两个日期(年月日)间隔。
    Duration 用于计算两个时间(秒,纳秒)间隔。
  3. Java 8 中对日期(Date类型)和日历(Calendar类型)的兼容和转化
  4. Java 8 中轻松格式化日期和时间的 API,代码先贴下面:
String localDateString = localDateTime.format(DateTimeFormatter.ISO_DATE);

localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));

localDateTime
 .format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
 .withLocale(Locale.UK);
  1. 以及Java 8 Core Date / Time API 可用的替代方案。
    写了后会将链接贴到此处:链接
  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值