Java中使用LocalDate根据日期来计算年龄
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根据日期来计算年龄的更多相关文章
- SQL 根据日期精确计算年龄
SQL 根据日期精确计算年龄 第一种: 一张人员信息表里有一人生日(Birthday)列,跟据这个列,算出该人员的年龄 datediff(year,birthday,getdate()) 例:birt ...
- Java中关于Date等日期类的简单使用
Date Date类不常用,很多方法被废弃了,常用它的两个构造方法来new一个Date对象. Date d1 = new Date(); //不传任何参数,代表当前时间点 System.out.pri ...
- JAVA中使用P和Q分量计算N和D进行RSA运算
最近在使用Java中需要使用PQ形式的私钥进行RSA加解密运算,本来以为Java中应该很多类似的例子,发现所有的例子都是从ND形式的私钥,竟然没有人用分量P和Q计算N和D进行运算.对Java使用RSA ...
- Java中如何判断一个日期字符串是否是指定的格式
判断日期格式是否满足要求 import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date ...
- Java 中如何格式化一个日期?如格式化为 ddMMyyyy 的形式?
Java 中,可以使用 SimpleDateFormat 类或者 joda-time 库来格式日期. DateFormat 类允许你使用多种流行的格式来格式化日期.参见答案中的示例代 码,代码中演示了 ...
- java中经常使用的日期格式化(全)
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; imp ...
- Java中String的哈希值计算
下面都是从String类的源码中粘贴出来的 private int hash; // Default to 0 public int hashCode() { int h = hash; if (h ...
- Java中json前后端日期传递处理
这里推荐2种方式 依赖包 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifa ...
- Java 中,如何对日期进行加减操作
今天在做项目时,遇到了对时间的加减进行操作的需求,根据传入的日期字符串,操作参数("+","-"),加数(要操作的天数),对日期进行加减操作,经查询资料,自己写 ...
随机推荐
- PHP进程锁
<?php /** * CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库 * 用于解决PHP在并发时候的锁控制,通过文件/eacc ...
- Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
1.继承映射 举例:对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一 ...
- 日志模块---logging
作用 在程序的运行过程中,会遇到很多需要打印的中间信息,通过使用logging模块可以详细的输出信息,不同于print()函数的单一功能. 应用场景 对于软件程序的运行过程中输出中间信息,如账单信息, ...
- Mysql 的 IF 判断
mysql自带很多判断逻辑,今天说一说IF的判断语句,正好今天做项目的时候也用到了 1. IF 判断 IF判断和我们代码里面写的有略微的差别,举个例子 IF('表达式','结果1','结果2') 如 ...
- linux上kafka模拟客户端发送、接受消息
producer 消息的生成者,即发布消息 consumer 消息的消费者,即订阅消息 broker Kafka以集群的方式运行,可以由一个或多个服务组成,服务即broker zook ...
- 【NOI2015】程序自动分析
https://www.luogu.org/problem/show?pid=1955 并查集+离散化. 先执行所有x=y问题,即合并x和y. 再依次执行所有x!=y问题,即查询x和y是否处于同一集合 ...
- vue 二进制文件的下载(解决乱码和解压报错)
问题描述:项目中使用的是vue框架进行开发,因为文件下载存在权限问题,所以并不能通过 a 链接的 href 属性直接赋值 URL进行下载, (如果你的文件没有下载权限,可以直接通过href属性赋值UR ...
- 主从DB与cache一致性
本文主要讨论这么几个问题: (1)数据库主从延时为何会导致缓存数据不一致 (2)优化思路与方案 一.需求缘起 上一篇<缓存架构设计细节二三事>中有一个小优化点,在只有主库时,通过" ...
- Windows 10 安装 Docker for Windows
Docker for Windows是Docker社区版(CE)应用程序. Docker for Windows安装包包括在Windows系统上运行Docker所需的一切. 本主题介绍了预安装注意事项 ...
- C:指针函数一些误区
当我们学完指针,知道每个数在内存中都占有一定的字节,也就是地址,才有取地址符号&,所以要交换两个数必须把这两个数所对应的内存互换,比如a=2;b=3;要让它们互换且输出,我们用一个函数来试试 ...