Java 8 知识归纳(三)—— 日期API

日期和时间API

LocalDate 和 LocalTime

       LocalDate类的实例是一个不可变对象,只提供了简单的日期,并不含当天的时间信息,同时不附带任何和时区相关的信息。 LocalTime

  • 使用静态工厂方法 now 从系统时钟中获取当前的日期:
LocalDate localDate = LocalDate.now();
//获取年
int year = localDate.getYear();
//获取月
int month = localDate.getMonthValue();
//获取日
int day = localDate.getDayOfMonth();
  • 使用静态工厂方法 of 创建一个 LocalDate 实例:
LocalDate date = LocalDate.of(2020,3,20);
  • 使用静态工厂方法 now 从系统时钟中获取当前的时间:
LocalTime localTime = LocalTime.now();
//获取小时
int hour = localTime.getHour();
//获取分钟
int minute = localTime.getMinute();
//获取秒
int second = localTime.getSecond();
  • 使用静态工厂方法 of 创建一个 LocalTime 实例:
//创建具有时分的LocalTime对象
LocalTime localTime = LocalTime.of(10,30);
//创建具有时分秒的LocalTime对象
LocalTime localTime = LocalTime.of(10,30,30);

合并日期和时间

       复合类LocalDateTime,是LocalDateLocalTime的合体,同时表示日期和时间,但不带有时区信息。可以像 LocalDateLocalTime一样,利用静态工厂方法now和 静态工厂方法 of创建。也可以通过合并LocalDate 对象 和 LocalTime对象创建。

//now()静态工厂方法创建当前时间的LocalDateTime对象
LocalDateTime localDateTime = LocalDateTime.now();
//of()静态工厂方法创建指定时间的LocalDateTime对象(2020-3-20 15:30:30)
LocalDateTime localDateTime = LocalDateTime.of(2020,3,20,15,30,30);
//合并LocalDate对象和LocalTime对象创建LocalDateTime对象
LocalDateTime localDateTime = LocalDateTime.of(localDate,localTime);

通过 LocalDate#atTime方法,向LocalDate对象传递LocalTime对象,创建一个LoaclTimeDate对象:

//对LocalDate对象 传递 LocalTime对象
LocalDateTime localDateTime = localDate.atTime(localTime);

通过LocalTime#atDate方法,向LocalTime对象 传递 LocalDate对象,创建一个LoaclTimeDate对象:

//对LocalTime对象 传递 LocalDate对象
LocalDateTime localDateTime = localTime.atDate(localDate);

LoaclTimeDate对象可以借助toLocalDate()方法 和 toLocalTime()方法分别提取 LocalDate 对象 和 LocalTime对象:

LocalDate localDate = localDateTime.toLocalDate();
LocalTime localTime = localDateTime.toLocalTime();

机器的日期和时间格式

       从计算机的角度来看,建模时间最自然的格式是表示一个持续的时间段上某个点的单一大整型数。Instant类对时间建模的方式,基本上以Unix元年的时间开始所经历的秒数进行计算。

Instant可支持静态工厂方法now,获取当前时刻的时间戳。

Instant instant = Instant.now();

定义 Duration 或 Period

       LocalDate类 、LocalTime类、Instant类 和 LocalDateTime类都是实现了 Temporal接口。可以创建 两个LocalTime对象、 两个 LocalDateTime对象,或者两个 Instant对象的之间的Duration。(由于LocalDateTime 和 Instant 是为不同目的设计的,两者不能混用。如果试图在这两类对象之间创建Duration,会触发一个DateTimeException异常。)

Duration duration = Duration.between(localDateTime1,localDateTime2);
Duration duration = Duration.between(localTime1,localTime2);
Duration duration = Duration.between(instant1,instant2);

       由于 Duration 类的静态主要用于以秒和纳秒衡量时间的长短,所以不能仅向 between方法中传递一个LocalDate对象做参数。当需要计量两个LocalDate之间的时长 时,可以使用Period#between():

Period period = Period.between(LocalDate.of(2020,3,20),
               LocalDate.of(2020,3,21));

       除了以两个Temporal对象的差值方式定义Duration 对象 或 Period对象时长外,还可以使用Duration 类 或 Period类都提供工厂方法进行创建创建。

Duration threeMinutes = Duration.ofMinutes(3);
Period tenDays = Period.ofDays(10);

操纵日期

       想修改一个LocalDate对象最直接的方法是使用withAttribute方法。withAttribute方法会创建一个对象的副本,并按照需要修改对应的属性。(返回一个修改了属性的LoacalDate对象,不修改原来的对象)

LocalDate date1 = LocalDate.of(2020,1,21);
LocalDate date2 = date1.withYear(2021);
LocalDate date3 = date1.withDayOfMonth(25);
LocalDate date4 = date1.with(ChronoField.MONTH_OF_YEAR,2);

       Temporal 对象使用 getwith 方法,对读取和修改进行区分开。如果 Temporal 对象不支持请求访问的字段,就会抛出一个 UnsupportedTemporalTypeException 异常。

  • Temporal#minus 创建一个副本,通过将当前Temporal对象的值减去一定的时长创建该副本

    //2020-01-21
    LocalDate date1 = LocalDate.of(2020,1,21);
    //2014-01-21
    LocalDate date4 = date1.minus(6, ChronoUnit.YEARS);
    
  • Temporal#plus 创建一个副本,通过将当前Temporal对象的值增加上一定的时长创建该副本

    //2020-01-21
    LocalDate date1 = LocalDate.of(2020,1,21);
    //2026-01-21
    LocalDate date4 = date1.plus(6, ChronoUnit.YEARS);
    

以声明的方式操作LocalDate对象:

// 2020-01-21
LocalDate date1 = LocalDate.of(2020,1,21);
// 2017-01-31
//可链式调用
LocalDate date2 = date1.plusDays(10).minusYears(3);

解析和格式化日期

  • 创建新的格式器(DateTimeFormatter)最简单的方法是通过它的静态工厂方法以及常量。(比如定义好的DateTimeFormatter.ISO_LOCAL_DATE

    LocalDate date1 = LocalDate.of(2020,1,21);
    String s1 = date1.format(DateTimeFormatter.ISO_LOCAL_DATE);
    
  • 可以使用工厂方法parse()打到重创该日期对象的目的:

    LocalDate date1 = LocalDate.parse("2020-03-20",DateTimeFormatter.ISO_LOCAL_DATE);
    
  • 可以使用工厂方法DateTimeFormatter.ofPattern() 自定义模式格式化模式:

    LocalDateTime dateTime = LocalDateTime.now();
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String s1 = dateTime.format(formatter);
    

参考资料

Java实战(第2版)

Java8系列

Java 8 知识归纳(一)—— 流 与 Lambda

Java 8 知识归纳(二)—— Optional

Java 8 知识归纳(三)—— 日期API

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