百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Java 8 新的时间api LocalDateLocalDateTime

toyiye 2024-05-19 19:35 13 浏览 0 评论

引言

在项目中,时间的使用必不可少,而java 8之前的时间api DateCalander等在使用上存在着很多问题,于是,jdk1.8引进了新的时间api -->LocalDateTime,很好解决了使用时间api所带来的问题。

先前槽点

  1. 使用Date或者Calendar表示时间很不方便
sql复制代码 Date date = new Date(2022,1,1);
 System.out.println(date);

会输出 Thu Feb 01 00:00:00 CST 3922

月份直接变成了Feb,而年份更是加上了1900

如果用calendar 指定月份,则需要注意月份从0开始,也就是表示1月要用0,或者使用提供的枚举

ini复制代码Calendar calendar = Calendar.getInstance();
calendar.set(2022, Calendar.AUGUST, 2);

但此时,Calendar年份的传值为2022,与年份一致,这样就导致了这两个时间api存在着不一致问题

  1. Calendar状态可变,在计算时需要创建一个新的Calendar

如calendar在add等操作之后,变成了一个新的Calendar,在下次比较时就可能会出现差错

csharp复制代码 calendar.add(Calendar.DAY_OF_MONTH, 1);

3. SimpleDateTimeFormat是非线程安全的。

于是,发布了新的时间api--LocalDateTime很好解决了上面存在的问题

简介

LocalDate、 LocalTime、 LocalDateTime类的实例是不可变的对象, 分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。 它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息。 顾名思义,LocalDate主要应用在日期,LocalTime主要应用在时间,而LocalDateTime则是时间和日期相结合。

方法概览

  • of: 静态工厂方法。
  • parse: 静态工厂方法,关注于解析。
  • get: 获取某些东西的值。
  • is: 检查某些东西的是否是true。
  • with: 不可变的setter等价物。
  • plus: 加一些量到某个对象。
  • minus: 从某个对象减去一些量。
  • to: 转换到另一个类型。
  • at: 把这个对象与另一个对象组合起来,例如: date.atTime(time)。

使用

  1. 获取LocalDateTime等对象

通过静态方法now() 获取

ini复制代码LocalDate now = LocalDate.now(); //获取当前的年月日  2023-05-07
System.out.println(now);

LocalTime now1 = LocalTime.now();//获取当前时间   13:05:46.609

System.out.println(now1);

LocalDateTime now2 = LocalDateTime.now();   //获取当前日期加时间  2023-05-07T13:05:46.609
System.out.println(now2);

通过of()指定年月日时分秒

ini复制代码LocalDate now = LocalDate.now(); //获取当前的年月日  2023-05-07
System.out.println(now);

LocalTime now1 = LocalTime.now();//获取当前时间   13:05:46.609

System.out.println(now1);

LocalDateTime now2 = LocalDateTime.now();   //获取当前日期加时间  2023-05-07T13:05:46.609
System.out.println(now2);

2. 获取对象相关参数,如年,月

ini复制代码LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int dayOfYear = now.getDayOfYear();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();

3. 格式化日期方法 format()以及DateTimeFormatter的使用

ini复制代码LocalDate now = LocalDate.now();
//JDK1.8 格式化日期的类 DateTimeFormatter
//指定格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String dateStr = now.format(formatter);
System.out.println(dateStr); // 2023年05月07日

LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分ss秒");
//把日期对象,格式化成日期字符串
String str = localDateTime.format(formatter2);
System.out.println(str); //2023年05月07日 13点57分53秒

4. 将LocalDateTime转换为LocalDate以及LocalTime

csharp复制代码System.out.println(localDateTime.toLocalDate()); //2023-05-07
System.out.println(localDateTime.toLocalTime());// 13:57:53.061

5. 比较日期或时间

ini复制代码
    // isAfter() 判断一个日期是否在指定日期之后
    // isBefore() 判断一个日期是否在指定日期之前
    // isEqual();
    // 判断两个日期是否相同
    // isLeapYear() 判断是否是闰年注意是LocalDate类中的方法
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime of = LocalDateTime.of(2023, 5, 7,14,0,0);

    System.out.println("当前时间为"+now); //当前时间为2023-05-07T14:04:18.676

    boolean after = now.isAfter(of);
    System.out.println(after);  // true

    boolean before = of.isBefore(now);
    System.out.println(before); //true

    boolean equal = now.isEqual(of);
    System.out.println(equal); //false

    boolean equal1 = of.isEqual(of);
    System.out.println(equal1); //true


    //判断是不是闰年
    boolean leapYear = now.toLocalDate().isLeapYear();
    System.out.println(leapYear); //false

月份的比较会特殊一点

ini复制代码//      now.getMonth().compareTo() 月份之间比较 相同则为0
        Month month = LocalDate.now().getMonth();
        Month month1 = LocalDate.of(2023, 6, 1).getMonth();
        System.out.println(month.compareTo(month1));

6. 将一个日期字符串解析成日期对象

ini复制代码String dateStr = "2022-12-03";
LocalDate parse = LocalDate.parse(dateStr);
System.out.println(parse);


String dateStr2 = "2022年12月03日";
//按照指定格式来解析
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate parse2 = LocalDate.parse(dateStr2, formatter); //
System.out.println(parse2);

System.out.println("======================");
String dateStr3 = "2021年10月05日 14点20分30秒";
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分ss秒");
LocalDateTime parse1 = LocalDateTime.parse(dateStr3, formatter2);
System.out.println(parse1);

7. 添加时间 plus

ini复制代码LocalDateTime ldt =LocalDateTime.now();
LocalDateTime localDateTime = ldt.plusYears(1);
LocalDateTime localDateTime1 = ldt.plusMonths(3);
LocalDateTime localDateTime2=ldt.plusHours(10);
LocalDateTime localDateTime2 = ldt.minusYears(8);

8. 计算时间间隔

  • Duration : 用于计算两个“时间”间隔的类
  • Period : 用于计算两个“日期”间隔的类
ini复制代码
    //Duration:用于计算两个"时间”间隔的类
    Duration betweenNowAnd = Duration.between(preious, end);
    //long seconds = between.getSeconds(); //间隔的秒值
    long l = betweenNowAnd.toMillis();
    System.out.println("耗时:" + l + "毫秒");

    LocalDate birthday = LocalDate.of(2000, 3, 20);
    LocalDate nowday = LocalDate.now();
    //Period:用于计算两个“日期”间隔的类
    Period between = Period.between(birthday, nowday);
    int years = between.getYears();
    int months = between.getMonths();
    int days = between.getDays();
    System.out.println(years);
    System.out.println(months);
    System.out.println(days);
  1. 设定时区
ini复制代码//创建日期对象
LocalDateTime now = LocalDateTime.now();
//获取不同国家的日期时间根据各个地区的时区ID名创建对象
ZoneId timeID = ZoneId.of("Asia/Shanghai");
//根据时区ID获取带有时区的日期时间对象
ZonedDateTime time = now.atZone(timeID);
System.out.println(time);
//方式2 通过时区ID 获取日期对象
LocalDateTime now2 = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(now2);

小结

LocalDate/LocalDateTime都是不可变且线程安全的,位于java.time包中,可以为时区提供更好的支持,加上DateTimeFormatter之后日期的解析及格式化也更加得心应手。


作者:EtherealGoGoGo
链接:https://juejin.cn/post/7235458133505015869

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码