Java8新的时间日期库

综述

时间API分类概述

新的API: java.time,由5个包组成

  • java.time- 包含值对象的基础包
  • java.time.chrono - 提供对不同的日历系统的访问
  • java.time.format - 格式化和解析时间和日期
  • java.time.temporal - 包括底层框架和扩展特性
  • java.time.zone - 包含市区支持的类

我们平时只会用到基础和format包,也可能用到temporal包,因此虽然新的API提供了多达68个新的公开类型,但是我们一般只会用到其中的三分之一

关键日期/时间概述
  • 不可变性。借鉴于java.util.Calendar的前车之鉴,设计这个API的时候着重考虑了原有方法的不可变性,不允许任何更改,如果必须改变的话就会返回一个新的实例,所以我们必须捕获该方法的返回值
  • 瞬间性。表示时间上的某个精确的时刻,使用从epoch开始计算的毫秒表示

关键API使用

Clock

他可以通过时区来获取当前的instant,日期和时间。Clock类可以用来代替System.currentTimeMillis()TimeZone.getDefault()

Clock clock=Clock.systemUTC();//获取格林尼治时间
System.out.println(clock.instant());//获取Instant类型数据,后面会讲到 
System.out.println(clock.millis());//获取标准毫秒数
Instant

所谓的Instant累代表的是某个时间(有点类似与java.util.Date),他是精确到纳秒的,而Date是精确到毫秒的。instant表示的是时间线上的一点,而不需要任何上下文信息,例如:时区。概念上讲他只是简单的表示自1970年1月1日0是0分0秒开始的秒数。下面给去确定一个方法的运行时间长度的代码

Instant start = Instant.now();
doSomeThing();  
Instant end = Instant.now();  
Duration duration = Duration.between(start, end);  
long seconds = duration.getSeconds();//秒表示  
long millis = duration.toMillis();//毫秒表示  
boolean isAfter = end.isAfter(start);//时间点end是否在start之后

常用函数

  • now() 静态函数,获取当前时间戳
  • isAfter()/isBefore() 判断两个时间点的先后顺序
  • plusXXX() 在该时间点加上某段时间
  • minusXXX() 在该时间点上减去某段时间

Instant用在当你需要记录事件的发生时间,额如需要记录任何有关时区信息时。Instant只能包含秒数和毫秒数,例如如下代码就会抛出异常

instant.get(ChronoField.MONTH_OF_YEAR);  
instant.plus(6, ChronoUnit.YEARS);  
LocalDate

LocalDate表示日期的不可变类型,不包含时间和时区。LocalDate和下面要讲的LocalTime都被设计成值类型的,这意味着我们不能用==来判断两个LocalDate是不是相等而是应该通过equals()。下面给出一个获取当前年月日的例子


LocalDate today = LocalDate.now();   
int year = today.getYear();   
int month = today.getMonthValue();   
int day = today.getDayOfMonth();   
System.out.printf(<span class="string">"Year : %d Month : %d day : %d \t %n", year, month, day);  

常用函数

  • now()根据当前时间戳创建LocalDate
  • of()根据制定的年月日创建LocalDate
  • parse(charqueue, DateTimeFormatter)根据传入的format将字符串转化为LocalDate对象
  • ofYearDay()根据指定的年和一年中的第几天创建LocalDate
  • getXXX()获取当前LocalDate中关于日期的信息,年月日等等
  • plusXXX()在当前的LocalDate的基础上增加指定时间类型来创建一个新的LocalDate
  • minusXXX()在当前的LocalDate的基础上减去指定时间类型来创建一个新的LocalDate
  • withXXX()在当前的LocalDate的基础上指定某个时间类型的值来创建一个新的LocalDate
  • isXXX()判断两个LocalDate的大小关系,特别(isLeepYear()判断是否为闰年)
  • lengthOfXXX()获取LocalDate代表的年或月的天数
  • with(TemporalAdjuster)TemporalAdjusters提供了几个用来获取TemporalAdjuster的方法,用来处理比较复杂的逻辑,比如获取当月的最后一天lastDayOfMonth()
  • atTime()LocalDate转化为LocalDateTime
LocalTime

LocalTime是值类型,且和日期,时区没有关联。当我们对时间进行加减操作时,以午夜为基准,24小时一个周期。因此,20:00加上6小时,结果是02:00。LocalTime用法和LocalDate类似


LocalTime time = LocalTime.of(20, 30);  
int hour = date.getHour(); // 20  
int minute = date.getMinute(); // 30  
time = time.withSecond(6); // 20:30:06  
time = time.plusMinutes(3); // 20:33:06  

常用函数

  • LocalDate基本类似,只是将对年月日的操作转换为时分秒
  • toSecondOfDay()获取该时间点距离0:00的秒数
LocalDateTime

这个值类型只是LocalDateLocalTime的简单组合。他表示一个和时区无关的日期和时间。LocalDateTime可以直接创建或者组合时间和日期


LocalDateTime dt1 = LocalDateTime.of(2014, Month.JUNE, 10, 20, 30);  
LocalDateTime dt2 = LocalDateTime.of(date, time);  
Month month = dt1.getMonth();  
int minute = dt1.getMinute();  

常用函数

  • LocalDateLocalTime两个类的plusXXX(), minusXXX(), withXXX(),getXXX()简单相加
  • LocalDate对象其他函数完全类似
  • isXXX()与LocalDate完全一样
  • toLocalDate()/toLocalTime()LocalDateTime转换为LocalTime或者LocalDate
时间长度

Duration表示以秒和纳秒位基准的时长;Period表示以年,月,日衡量的时长。他们可以作为参数,传给主要的时间/日期类的增加或减少的方法,也可以计算两个时间点之间的间隔


Duration duration = Duration.ofDays(10);  
LocalTime start = LocalTime.now();  
doSoneThing();  
LocalTime end = LocalTime.now();  
Duration spend = Duration.between(start, end);  

常用函数

  • ofXXX()根据参数指定的大小计算以XXX个单位的时间间隔
  • between(arg1, arg2)计算两个参数时间点的时间间隔
  • plusXXX()/minuxXXX()在当前时间间隔的基础上加上或减去指定个单位的时间
  • toXXX()将时间间隔格式化位指定单位的时间,Duration一般使用该类型函数,Period一般使用getXXX()
  • abs()求时间间隔的绝对值,保证时间间隔不为负数
  • isZero()/isNegative()判断时间间隔是否为0或负
  • withXXX()直接指定某个单位的值
格式化

java.time.format包是专门用来格式化输出输入时间/日期的。这个包围绕DateTimeFormatter类和它的辅助创建类DateTimeFormatterBuilder展开。静态方法ofPattern(Charqueue)DateTimeFormatter中的常量是最通用的创建格式化器的方式

  • 常用ISO格式常量,如ISO_LOCAL_DATE
  • 字母模式,如ofPattern(“dd/MM/uuuu”)
  • 本地化样式,如ofLocalizedDate(FormatStyle.MEDIUM)

有了格式化器,我们就可以将该实例传递给parse()或者format()作为参数,用来将字符串格式化为对象或者将对象格式化位字符串


//按照内置的不同方式格式化  
String format = DateTimeFormatter.ISO_LOCAL_DATE.format(LocalDate.now());  
String format2 = DateTimeFormatter.ISO_LOCAL_TIME.format(LocalTime.now());  
String format3 = DateTimeFormatter.ISO_DATE.format(LocalDateTime.now());  
String format4 = DateTimeFormatter.ISO_INSTANT.format(Instant.now());  
System.out.println(format);  
System.out.println(format2);  
System.out.println(format3);  
System.out.println(format4);  
    
//按照标准格式格式化  
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);  
String format5 = formatter.format(LocalDateTime.now());  
System.out.println(format5);  
    
//按照指定方式格式化  
DateTimeFormatter pattern = DateTimeFormatter.ofPattern(<span class="string">"yyyy-MM-dd E HH:mm:ss");  
String format6 = pattern.format(LocalDateTime.now());  
System.out.println(format6);  
其他

YearMonth仅仅包含年和月字段,操作也LocalDate类似
MonthDay仅仅包含月和日字段,操作与LocalDate类似

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

推荐阅读更多精彩内容