原文LocalDate和LocalTime的用法介绍

在JAVA中,常用的处理日期和时间的类主要有Date,Calendar,而在JDK1.8中,新增了两个处理日期和时间的类,一个是LocalDate,另一个是LocalTime,下面我来介绍一下这两个类中常用方法的用法。

 1、LocalDate

  LocalDate主要是用来处理日期的类,主要有以下方法:

方法 说明 举例
LocalDate.now() 获取当前日期
LocalDate localDate = LocalDate.now();
System.out.println(localDate);

运行结果为:2019-01-07

LocalDate.of(int year, int month, int dayOfMonth)

根据参数设置日期,参数分别为年,月,日

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate);

运行结果为:2019-01-07

localDate.getDayOfMonth()

localDate.getDayOfWeek()

localDate.getDayOfYear()

获取当前日期是所在月的第几天

获取当前日期是星期几(星期的英文全称)

获取当前日期是所在年的第几天

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.getDayOfMonth());
System.out.println(localDate.getDayOfWeek());
System.out.println(localDate.getDayOfYear());

运行结果为:7,MONDAY,7

localDate.getMonth()

localDate.getMonthValue()

localDate.lengthOfMonth()

获取当前日期所在月份(月份的英文全称)

获取当前日期所在月份的数值

获取当前日期所在月份有多少天

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.getMonth());
System.out.println(localDate.getMonthValue());
System.out.println(localDate.lengthOfMonth());

运行结果为:JANUARY,1,31


localDate.lengthOfYear()

localDate.isLeapYear()

获取当前日期所在年有多少天

获取当前日期所在年是否是闰年

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.lengthOfYear());
System.out.println(localDate.isLeapYear());

运行结果为:365,false

localDate.withDayOfMonth(int dayOfMonth)

localDate.withDayOfYear(int dayOfYear)

localDate.withMonth(int month)

localDate.withYear(int year)

with开头的方法,我的理解是将参数替换localDate中的对应

属性,重新计算得到新的日期。

将参数中的"日"替换localDate中的"日"

将参数中的天数替换localDate中的天数

将参数中的"月"替换localDate中的"月"

将参数中的"年"替换localDate中的"年"

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.withDayOfMonth(2));
System.out.println(localDate.withDayOfYear(40));
System.out.println(localDate.withMonth(2));
System.out.println(localDate.withYear(2020));

运行结果为:

2019-01-02,

2019-02-09,

2019-02-07,

2020-01-07

localDate.minusDays(long days)

localDate.minusWeeks(long weeks)

localDate.minusMonths(long months)

localDate.minusYears(long years)

localDate.plusDays(long days)

localDate.plusWeeks(long weeks)

localDate.plusMonths(long months)

localDate.plusYears(long years)

将当前日期减一天

将当前日期减一周

将当前日期减一月

将当前日期减一年

将当前日期加一天

将当前日期加一周

将当前日期加一月

将当前日期加一年

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.minusDays(1));
System.out.println(localDate.minusMonths(1));
System.out.println(localDate.minusWeeks(1));
System.out.println(localDate.minusYears(1));
System.out.println(localDate.plusDays(1));
System.out.println(localDate.plusMonths(1));
System.out.println(localDate.plusWeeks(1));
System.out.println(localDate.plusYears(1));

运行结果为:

2019-01-06
2018-12-07
2018-12-31
2018-01-07
2019-01-08
2019-02-07
2019-01-14
2020-01-07

 2、LocalTime

  LocalTime主要是用来处理时间的类,主要有以下方法:

方法 说明 举例
LocalTime.now() 获取当前时间
LocalTime localTime = LocalTime.now();
System.out.println(localTime);

运行结果为:22:53:44.277

LocalTime.of(int hour, int minute)

LocalTime.of(int hour, int minute, int second)

根据参数设置时间,参数分别为时,分

根据参数设置时间,参数分别为时,分,秒

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime);
localTime = LocalTime.of(12,35);
System.out.println(localTime);

运行结果为:12:35:59,12:35

localTime.getHour()

localTime.getMinute()

localTime.getSecond()

获取当前时间的小时数

获取当前时间的分钟数

获取当前时间的秒数

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.getHour());
System.out.println(localTime.getMinute());
System.out.println(localTime.getSecond());

运行结果为:12,35,59

localTime.withHour(int hour)

localTime.withMinute(int minute)

localTime.withSecond(int second)

with开头的方法,我的理解是将参数替换localTime中的对应属性,

重新计算得到新的时间。

将参数中的"小时"替换localTime中的"小时"

将参数中的"分钟"替换localTime中的"分钟"

将参数中的"秒"替换localTime中的"秒"

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.withHour(1));
System.out.println(localTime.withMinute(1));
System.out.println(localTime.withSecond(1));

运行结果为:

01:35:59
12:01:59
12:35:01

localTime.minusHours(long hours)

localTime.minusMinutes(long minutes)

localTime.minusSeconds(long seconds)

localTime.plusHours(long hours)

localTime.plusMinutes(long minutes)

localTime.plusSeconds(long seconds)

将当前时间减一小时

将当前时间减一分钟

将当前时间减一秒

将当前时间加一小时

将当前时间加一分钟

将当前时间加一秒

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.minusHours(1));
System.out.println(localTime.minusMinutes(1));
System.out.println(localTime.minusSeconds(10));
System.out.println(localTime.plusHours(1));
System.out.println(localTime.plusMinutes(1));
System.out.println(localTime.plusSeconds(10));

运行结果为:

11:35:59
12:34:59
12:35:49
13:35:59
12:36:59
12:36:09

 3、日期 + 时间

  从1和2中可以看出,LocalDate的方法主要都是用来处理日期的,而LocalTime的方法主要都是用来处理时间的,但两个类都提供了表示日期 + 时间的方法。

LocalDate提供了atTime方法,用来表示日期 + 时间

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.atTime(LocalTime.now()));
System.out.println(localDate.atTime(10,30));
System.out.println(localDate.atTime(10,30,59));

运行结果为:

2019-01-07T23:21:32.804
2019-01-07T10:30
2019-01-07T10:30:59

LocalTime提供了atDate方法,用来表示日期 + 时间

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.atDate(LocalDate.of(2019,1,7)));

运行结果为:2019-01-07T12:35:59

 4、格式转换

  从3中我们可以看出,表示日期 + 时间后,格式发生了变化,原来atTime和atDate方法的返回值都是LocalDateTime类,这个类把toString()方法重写了,导致输出的格式变化了。

@Override
public String toString() {
return date.toString() + 'T' + time.toString();
}

那么想要转换日期或时间的格式该怎么办呢?

LocalDate和LocalTime都提供了格式转换的方法,format和parse

方法 说明 举例
LocalDate.format(DateTimeFormatter formatter)

将LocalDate类型的数据转换为String类型的数据,参数为DateTimeFormatter类,该类提供了ofPattern(String pattern)方法,可传入相应的日期格式:

yyyy,

yyyy-MM,

yyyy-MM-dd,

yyyy-MM-dd HH,

yyyy-MM-dd HH:mm,

yyyy-MM-dd HH:mm:ss

注:若LocalDate未调用atTime方法,则表示LocalDate只表示日期,则此时不能转换带有时间格式的表示式

LocalDate localDate = LocalDate.of(2019,1,7);
LocalTime localTime = LocalTime.now(); DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy");
System.out.println(localDate.atTime(localTime).format(f)); DateTimeFormatter f2 = DateTimeFormatter.ofPattern("yyyy-MM");
System.out.println(localDate.atTime(localTime).format(f2)); DateTimeFormatter f3 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
System.out.println(localDate.atTime(localTime).format(f3)); DateTimeFormatter f4 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(localDate.atTime(localTime).format(f4)); DateTimeFormatter f5 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
System.out.println(localDate.atTime(localTime).format(f5)); DateTimeFormatter f6 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
System.out.println(localDate.atTime(localTime).format(f6));

运行结果为:

2019
2019-01
2019-01-07
2019-01-07 23:49:08
2019-01-07 23:49
2019-01-07 23

LocalTime.format(DateTimeFormatter formatter)

将LocalTime类型的数据转换为String类型的数据,参数为DateTimeFormatter类,

该类提供了ofPattern(String pattern)方法,可传入相应的日期格式:

yyyy,

yyyy-MM,

yyyy-MM-dd,

yyyy-MM-dd HH,

yyyy-MM-dd HH:mm,

yyyy-MM-dd HH:mm:ss

注:若LocalTime未调用atDate方法,则表示LocalTime只表示时间,则此时不能转换带有日期格式的表示式

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(LocalTime.now().atDate(LocalDate.now()).format(formatter));

运行结果为:2019-01-07 23:07:06

其他格式这里就不一一列举了

LocalDate.parse(CharSequence text)

将日期字符串转换成LocalDate类型,不能转换带时间格式的字符串

System.out.println(LocalDate.parse("2019-10-15"));

运行结果为:2019-10-15

LocalTime.parse(CharSequence text)

将时间字符串转换成LocalTime类型,不能转换带日期格式的字符串

System.out.println(LocalTime.parse("22:35:40"));

运行结果为:22:35:40

 5、总结

  JDK1.8将处理日期和时间的类从原来的Date,Calendar变成了LocalDate和LocalTime两个类,从原来的一个类处理日期 + 时间,变成了由两个类各司其职,更加体现了面向对象的思想,两个类都各自提供了相应范围内的方法,个人觉得有利有弊。有利的是两个类对各自范围内的日期(时间)的计算都提供了更好的处理方法,双方互不干扰,更加的方便。不利的是在同时需要日期和时间的场景下,这两个类目前提供的atTime和atDate方法还不能令人满意,使用起来不是很方便(还需要转换一下格式)。另外,LocalDate类型对应数据库的日期类型的字段时,是否可以像Date类型那样方便,有待研究。

  好了,先说到这吧!

LocalDate和LocalTime的用法介绍的更多相关文章

  1. java8中的localdate和localtime用法举例

    java8中的localdate和localtime用法举例如下:这两个方法使我们可以方便的实现将旧的日期类转换为新的日期类,具体思路都是通过Instant当中介,然后通过Instant来创建Loca ...

  2. 好压(HaoZip)的命令行模式用法介绍

    好压压缩软件,又叫“2345好压”,是一款国产的优秀压缩软件,目前是免费的,据官网介绍,该软件永久免费.官网地址:http://haozip.2345.com/ 本文主要对该软件的命令行模式用法进行介 ...

  3. sql事务(Transaction)用法介绍及回滚实例

    sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...

  4. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  5. 怎么通过activity里面的一个按钮跳转到另一个fragment(android FragmentTransaction.replace的用法介绍)

    即:android FragmentTransaction.replace的用法介绍 Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,他们之间最 ...

  6. Oracle CASE WHEN 用法介绍[Z]

    Oracle CASE WHEN 用法介绍 1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ...

  7. LinqToXml高级用法介绍

    LinqToXml高级用法介绍 一.函数构造 什么是函数构造?其是指通过单个语句构建XML树的能力. 那么它有什么作用呢? 作用1.用单个表达式快速创建复杂的XML树 见实例代码CreateXml( ...

  8. Oracle学习笔记_06_CASE WHEN 用法介绍

    1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex ' THEN '男' ' THEN '女' ELSE '其他' END --Case搜索函数 CASE ' THEN ...

  9. mysql进阶(六)模糊查询的四种用法介绍

    mysql中模糊查询的四种用法介绍 这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下. 下面介绍mysql中模糊查询的四种用法: 1 %: 表示任意0个或多个字符.可匹配任意类型 ...

随机推荐

  1. 【剑指Offer】59:对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题解:递归 public static boolean isSymmetric ...

  2. P1000题解 超级玛丽游戏

    P1000这么难,必须要水一篇题解/斜眼笑 ******** ************ ####....#. #..###.....##.... ###.......###### ### ### .. ...

  3. HashMap初始化容量过程

    集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生.在日常开发中,我们经常会像如下方式以下创建一个HashMap: Map&l ...

  4. Prometheus的查询语法是PromQL基本语法

    PromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,语言表现力很丰富,内置函数也很多.使用它可以对时序数据进行筛选和聚合. 1- Prom ...

  5. 2020 CCPC Wannafly Winter Camp Day1 Div.1&amp F

    #include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...

  6. [PAT] A1018 Public Bike Management

    [思路] 题目生词 figure n. 数字 v. 认为,认定:计算:是……重要部分 The stations are represented by vertices and the roads co ...

  7. c#在类里不能使用Response解决方法

    response对应的类是HttpResponse,  在System.Web 命名字间里,   如果你在类中要使用   Response 的话,   需要使用System.Web.HttpConte ...

  8. 针对mysql8.0报错:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create

    折腾了好久,后来发现是版本问题,驱动和数据库不匹配导致. 原来用的是5.1.37的驱动.数据库是mysql5.7,可以连接成功. 就在我把数据库换成了8.0之后,所有的买点啥都报标题里的错误了.   ...

  9. ROS学习--RViz使用的要点

    1.RViz文件保存,下次面板打开时,默认展示上一次的配置 2.设置Fixed_Frame很重要,一打开默认配置,就要确认这个参数是否正确配置,不然会出现:激光数据不展示.点pose_initial时 ...

  10. 问题 E: Problem B

    #include <cstdio> #include <cstring> #include <algorithm> #include <vector> ...