首页 > 编程语言 >最新!Java8 中获取当前时间,日期处理,求闰年?LocalDateTime的详细使用,DateTimeFormatter使用。

最新!Java8 中获取当前时间,日期处理,求闰年?LocalDateTime的详细使用,DateTimeFormatter使用。

时间:2024-04-08 15:00:59浏览次数:13  
标签:System parse 日期 API DateTimeFormatter LocalDateTime LocalDate Java8 LocalTime

文章目录

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)+"月");
年月==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方法:

  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"));

怎么样,是不是非常的方便,真的非常不错

标签:System,parse,日期,API,DateTimeFormatter,LocalDateTime,LocalDate,Java8,LocalTime
From: https://blog.csdn.net/weixin_44144455/article/details/137492814

相关文章

  • java8 Lambda 异常处理
    异常接口publicclassTry{ publicstatic<T>Consumer<?superT>of(UncheckedConsumer<T>action){ Objects.requireNonNull(action); returnt->{ try{ action.accept(t); }catch(Exceptione){ thrownewRuntimeExcepti......
  • 常用API(一):1.JDK8新增的时间 2.LocalDate 3.LocalTime 4.LocalDateTime
    1.JDK8新增的时间    2.  3.LocalTime: 2.LocalDate:packagecom.itheima.新时间API;importjava.time.LocalDate;publicclassa{publicstaticvoidmain(String[]args){//0.获取本地日期对象(不可变对象)LocalDateld=LocalD......
  • Java代码实现带时区时间字符串转为LocalDateTime对象
    不带时区时间字符串可以使用Java8中的DateTimeFormatter类来将字符串转换为LocalDateTime对象。下面是一个示例代码:importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassDateTimeConversionExample{publicstaticvoidmain(Stri......
  • Java零基础入门-java8新特性(上篇)
    一、本期教学目标java8有哪些新特性什么是函数式接口什么是Lambda表达式掌握Stream ApiStream和Collect集合区别Stream创建方式Stream操作三步骤二、概述        上几期,我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念,而这一期,我们要......
  • Java零基础入门-java8新特性(下篇)
    一、概述     ​上几期,我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念,而这一期,我们要来玩点好的东西,那就是java8,我们都知道java8是自2004年发布java5之后最重要且一次重大的版本更新,虽然我们的JDK环境也升级到了java1.8,但是在日常的开......
  • Java代码实现带时区时间字符串转为LocalDateTime对象
    不带时区时间字符串可以使用Java8中的DateTimeFormatter类来将字符串转换为LocalDateTime对象。下面是一个示例代码:importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassDateTimeConversionExample{publicstaticvoidmain(Stri......
  • JAVA8-Lambda表达式
    Lambda表达式是Java8中引入的一项特性,它提供了一种简洁的方法来表示只有一个方法的接口(即函数式接口)的实例。Lambda表达式通常用于创建匿名方法。这种表达式是函数式编程的核心,允许开发者写出更简洁、更灵活的代码。Lambda表达式的结构Lambda表达式的一般形式是(参数列......
  • On Java8读书笔记
    ObjectsEveryWhere使用Reference掌控对象掌控一个对象有两种不同的方式:直接掌控变量本身or间接掌控一个"通道",通过"通道"可以掌控对象在Java中,我们通过间接的方式掌控对象,而这个"通道"就是ReferenceReference不同于对象本身,对象本身往往是"臃肿的"(对象内包括字段和......
  • Java8递归生成树
    @Data@BuilderpublicclassMenu{/***id*/publicIntegerid;/***名称*/publicStringname;/***父id,根节点为0*/publicIntegerparentId;/***子节点信息*/publicList<Menu>......
  • Centos安装配置Java8
    查看Centos发行版本[root@lavm-ik3g4r3pga~]#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)查看java8安装包[root@lavm-ik3g4r3pga~]#yumlistjava-1.8*Loadedplugins:fastestmirrorRepositorybaseislistedmorethanonceintheconfiguration......