Java8新特性之日期-时间API

在Java8之前的版本中,我们处理时间类型常常使用的是java.util包下的Date类。

但使用Date类却有诸多的弊端,如:java.util.Date是非线程安全的,所有的日期类都是可变的;日期/时间类的定义并不一致,在java.util和java.sql的包下都含有Date类,在开发过程中极易出错; 日期类并不提供国际化,没有时区支持

为了解决以上问题,Java8在java.time包下提供了很多新的API,常用的类包括LocalDate、LocalTime、LocalDateTime,用以处理日期,时间,日期/时间等

LocalDate类

LocalDate是一个不可变类,在不考虑时区的情况下可以对日期(不包括时间)进行各种操作,它的默认格式是yyyy-MM-dd

获取当前日期以及年、月、日

代码示例:

//获取当前日期以及年、月、日
LocalDatelocalDate=LocalDate.now();
intyear=localDate.getYear();
intmonth=localDate.getMonthValue();
intday=localDate.getDayOfMonth();
System.out.println("当前日期:"+localDate);
System.out.println("年:"+year+"月:"+month+"日:"+day);

运行结果:
当前日期:2018-12-12
年:2018月:12日:12
获取指定的日期

代码示例:

//获取指定的日期
LocalDatespecifiedDay=LocalDate.of(2008,8,18);
System.out.println("指定日期:"+specifiedDay);

运行结果:

指定日期:2008-08-18
比较两个时间的先后顺序以及是否相等

代码示例:

LocalDatelocalDate=LocalDate.now();
LocalDateotherDate=LocalDate.of(2018,11,11);

//equals方法用于比较两个日期是否相等
if(localDate.equals(otherDate)){
System.out.println("localDate与otherDate相等!");
}else{
//isAfter和isBefore方法用于比较两个日期前后顺序
if(localDate.isAfter(otherDate)){
System.out.println("localDate晚于otherDate!");
}
if(localDate.isBefore(otherDate)){
System.out.println("localDate早于otherDate!");
}
}

运行结果:

localDate晚于otherDate!
对日期做加减运算

代码示例:

LocalDatelocalDate=LocalDate.now();
System.out.println("2年后日期:"+localDate.plusYears(2));
System.out.println("6月后日期:"+localDate.plusMonths(6));
System.out.println("3周后日期:"+localDate.plusWeeks(3));
System.out.println("15天后日期:"+localDate.plusDays(15));

System.out.println("2年前日期:"+localDate.minusYears(2));
System.out.println("6月前日期:"+localDate.minusMonths(6));
System.out.println("3周前日期:"+localDate.minusWeeks(3));
System.out.println("15天前日期:"+localDate.minusDays(15));

运行结果:

2年后日期:2020-12-12
6月后日期:2019-06-12
3周后日期:2019-01-02
15天后日期:2018-12-27

2年前日期:2016-12-12
6月前日期:2018-06-12
3周前日期:2018-11-21
15天前日期:2018-11-27
获取日期间隔的天数

代码示例:

//获取某年份的第N天的日期
LocalDatespecialDay=LocalDate.ofYearDay(2018,100);
System.out.println("2018年的第100天:"+specialDay);
//获取两个日期的间隔天数
longintervalDay=localDate.toEpochDay()-specialDay.toEpochDay();
System.out.println("间隔天数:"+intervalDay);

运行结果:
2018年的第100天:2018-04-10
间隔天数:246

LocalTime类

LocalTime与LocalDate一样,也是一个不可变的类,默认格式是hh:mm:ss.zzz,它提供了对时间的各种操作

获取当前时间以及自定义时间
代码示例:

//获取当前时间、时、分、秒以及自定义时间
LocalTimelocalTime=LocalTime.now();
inthour=localTime.getHour();
intminute=localTime.getMinute();
intsecond=localTime.getSecond();
System.out.println("当前时间:"+localTime);
System.out.println("时:"+hour+"分:"+minute+"秒:"+second);

//获取自定义时间
LocalTimespecifiedTime=LocalTime.of(15,30,45);
System.out.println("自定义时间:"+specifiedTime);

运行结果:

当前时间:13:45:59.039
时:13分:45秒:59
自定义时间:15:30:45
比较两个时间的先后顺序

代码示例:

//equals方法比较两个时间是否相等
if(localTime.equals(specifiedTime)){
System.out.println("localTime与specifiedTime相等!");
}else{
//isAfter、isBefore方法比较两个时间的先后顺序
if(localTime.isAfter(specifiedTime)){
System.out.println("localTime晚于specifiedTime!");
}
if(localTime.isBefore(specifiedTime)){
System.out.println("localTime早于specifiedTime!");
}
}

运行结果:
localTime早于specifiedTime!
对时间做加减运算
代码示例:

LocalTimelocalTime=LocalTime.now();
System.out.println("当前时间:"+localTime);
System.out.println("2小时后时间:"+localTime.plusHours(2));
System.out.println("30分钟后时间:"+localTime.plusMinutes(30));
System.out.println("500秒后日时间:"+localTime.plusSeconds(500));

System.out.println("2小时前时间:"+localTime.minusHours(2));
System.out.println("30分钟前时间:"+localTime.minusMinutes(30));
System.out.println("500秒前时间:"+localTime.minusSeconds(500));

运行结果:

当前时间:14:10:15.666
2小时后时间:16:10:15.666
30分钟后时间:14:40:15.666
500秒后时间:14:18:35.666

2小时前时间:12:10:15.666
30分钟前时间:13:40:15.666
500秒前时间:14:01:55.666

LocalDateTime类

LocalDateTime是一个不可变的日期-时间对象,它既包含了日期同时又含有时间,默认格式是yyyy-MM-ddTHH-mm-ss.zzz

获取当前日期时间以及自定义日期时间

示例代码:

//获取当前的日期时间
LocalDateTimelocalDateTime=LocalDateTime.now();
System.out.println("当前的日期时间:"+localDateTime);

//获取自定义的的日期时间
LocalDateTimespecifiedDateTime=LocalDateTime.of(LocalDate.now(),LocalTime.now());
System.out.println("自定义的日期时间:"+specifiedDateTime);

运行结果:

当前的日期时间:2018-12-12T14:31:00.163
自定义的日期时间:2018-12-12T14:31:00.164

转化为日期和时间

代码示例:

//转化为LocalDate和LocalTime
LocalDatelocalDate=localDateTime.toLocalDate();
LocalTimelocalTime=localDateTime.toLocalTime();
System.out.println("当前日期:"+localDate);
System.out.println("当前时间:"+localTime);

运行结果:

当前日期:2018-12-12
当前时间:14:31:00.163

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容