Java中和日期直接相关的类有很多,平时最常用到的就是java.util package下面的Date和Calendar,需要用到格式的时候还会用到java.text.SimpleDateFormat

首先吐槽一下,Date和Calendar实际用起来还是有一些别扭的,刚开始用的时候不熟悉,老是分不清Date和Calendar类的具体用法和区别。

而且Calendar类的set方法来设置日期时又有一些反人类,设置月份的时候总是要脑补一下减去1,比如要设置为2018年1月6日就要设置成2018,0,6,因为在这里一月是用0来表示的:

Calendar cal = Calendar.getInstance();
cal.set(2018, 0, 8);

具体的原因可以看这里的回答:StackOverflow: Why is January month 0 in Java Calendar?

反正我是不太看得下去。。

前几天有一个简单的需求,就是根据某两个日期来计算出年龄。上网查了一下,直接抛弃了难用的Date和Calendar类,直接用java.time.LocalDate来做。话不多说直接上代码:

import java.time.LocalDate;

public class TestLocalDate {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2018, 1, 6);
LocalDate date2 = LocalDate.of(1991, 1, 3);
int age = date2.until(date1).getYears(); System.out.println("You're " + age + " years old.");
}
}

输出结果:

You're 27 years old.

抛弃了略显复杂令人头大的Date和Calendar类之间的互相转换调用,代码读起来也特别清晰,是不是很爽!

java.time是Java 8中新引入的一个日期时间库,下面的这些方法都是java.time包里面的。

下面来看一下这段代码是怎么来用简单清爽的方式计算时间差的:

首先,LocalDate是一个immutable class(不可变类),所以和String类一样,不需要new一个新的对象才可以使用(?)

然后是LocalDate类用于设定日期的of方法:

public static LocalDate of(int year, Month month, int dayOfMonth)
public static LocalDate of(int year, int month, int dayOfMonth)

of一共有三个重载的方法,这里举出其中的两个。第一个的Month类是一个枚举类型,包含了月份的英文名称,如JANUARY, NOVEMBER等

第二个就是再正常不过的设置年月日,好消息是这里的month是从1开始的,也就是说再也不用手动减去1了!!!

下面是LocalDate类用于比较日期的until方法:

public Period until(ChronoLocalDate endDateExclusive)

这个方法返回的是一个Period类型的对象。

Period代表的是形如“2年,3个月,4天”的一段时间间隔。接下来调用的getYears方法就是属于Period类的。

最后再来看一下Period类的一些获取时间间隔的方法:

public int getYears()
public int getMonths()
public int getDays()

这三个方法分别用于获取时间间隔的年、月和日。对,就是这么简单。

闲来无事时看看语言的新特性,多掌握些技能总是不会错的。

Java中使用LocalDate根据日期来计算年龄的更多相关文章

  1. SQL 根据日期精确计算年龄

    SQL 根据日期精确计算年龄 第一种: 一张人员信息表里有一人生日(Birthday)列,跟据这个列,算出该人员的年龄 datediff(year,birthday,getdate()) 例:birt ...

  2. Java中关于Date等日期类的简单使用

    Date Date类不常用,很多方法被废弃了,常用它的两个构造方法来new一个Date对象. Date d1 = new Date(); //不传任何参数,代表当前时间点 System.out.pri ...

  3. JAVA中使用P和Q分量计算N和D进行RSA运算

    最近在使用Java中需要使用PQ形式的私钥进行RSA加解密运算,本来以为Java中应该很多类似的例子,发现所有的例子都是从ND形式的私钥,竟然没有人用分量P和Q计算N和D进行运算.对Java使用RSA ...

  4. Java中如何判断一个日期字符串是否是指定的格式

    判断日期格式是否满足要求 import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date ...

  5. Java 中如何格式化一个日期?如格式化为 ddMMyyyy 的形式?

    Java 中,可以使用 SimpleDateFormat 类或者 joda-time 库来格式日期. DateFormat 类允许你使用多种流行的格式来格式化日期.参见答案中的示例代 码,代码中演示了 ...

  6. java中经常使用的日期格式化(全)

    import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; imp ...

  7. Java中String的哈希值计算

    下面都是从String类的源码中粘贴出来的 private int hash; // Default to 0 public int hashCode() { int h = hash; if (h ...

  8. Java中json前后端日期传递处理

    这里推荐2种方式 依赖包 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifa ...

  9. Java 中,如何对日期进行加减操作

    今天在做项目时,遇到了对时间的加减进行操作的需求,根据传入的日期字符串,操作参数("+","-"),加数(要操作的天数),对日期进行加减操作,经查询资料,自己写 ...

随机推荐

  1. PHP进程锁

    <?php /** * CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库 * 用于解决PHP在并发时候的锁控制,通过文件/eacc ...

  2. Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )

    1.继承映射 举例:对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一 ...

  3. 日志模块---logging

    作用 在程序的运行过程中,会遇到很多需要打印的中间信息,通过使用logging模块可以详细的输出信息,不同于print()函数的单一功能. 应用场景 对于软件程序的运行过程中输出中间信息,如账单信息, ...

  4. Mysql 的 IF 判断

    mysql自带很多判断逻辑,今天说一说IF的判断语句,正好今天做项目的时候也用到了 1. IF 判断 IF判断和我们代码里面写的有略微的差别,举个例子 IF('表达式','结果1','结果2')  如 ...

  5. linux上kafka模拟客户端发送、接受消息

    producer   消息的生成者,即发布消息 consumer   消息的消费者,即订阅消息 broker     Kafka以集群的方式运行,可以由一个或多个服务组成,服务即broker zook ...

  6. 【NOI2015】程序自动分析

    https://www.luogu.org/problem/show?pid=1955 并查集+离散化. 先执行所有x=y问题,即合并x和y. 再依次执行所有x!=y问题,即查询x和y是否处于同一集合 ...

  7. vue 二进制文件的下载(解决乱码和解压报错)

    问题描述:项目中使用的是vue框架进行开发,因为文件下载存在权限问题,所以并不能通过 a 链接的 href 属性直接赋值 URL进行下载, (如果你的文件没有下载权限,可以直接通过href属性赋值UR ...

  8. 主从DB与cache一致性

    本文主要讨论这么几个问题: (1)数据库主从延时为何会导致缓存数据不一致 (2)优化思路与方案 一.需求缘起 上一篇<缓存架构设计细节二三事>中有一个小优化点,在只有主库时,通过" ...

  9. Windows 10 安装 Docker for Windows

    Docker for Windows是Docker社区版(CE)应用程序. Docker for Windows安装包包括在Windows系统上运行Docker所需的一切. 本主题介绍了预安装注意事项 ...

  10. C:指针函数一些误区

    当我们学完指针,知道每个数在内存中都占有一定的字节,也就是地址,才有取地址符号&,所以要交换两个数必须把这两个数所对应的内存互换,比如a=2;b=3;要让它们互换且输出,我们用一个函数来试试 ...