文档章节

日期和时间API - 读《Java 8实战》

yysue
 yysue
发布于 08/14 23:40
字数 1273
阅读 81
收藏 1

日期与时间

LocalDate

创建一个LocalDate对象并读取其值

// 根据年月日创建日期
LocalDate date1 = LocalDate.of(2014, 3, 18);

// 读取
System.out.println(date1.getYear()); // 2014
System.out.println(date1.getMonth()); // MARCH
System.out.println(date1.getMonth().getValue()); // 3
System.out.println(date1.getDayOfMonth()); // 18
System.out.println(date1.lengthOfMonth()); // 31
System.out.println(date1.isLeapYear()); // false

// 当前日期
LocalDate now = LocalDate.now();
System.out.println(now); // 2018-08-14

// 从日期对象中获取年月日
System.out.println(now.get(ChronoField.YEAR)); // 2018
System.out.println(now.get(ChronoField.MONTH_OF_YEAR)); // 8
System.out.println(now.get(ChronoField.DAY_OF_MONTH)); // 14

LocalTime

创建LocalTime并读取值

// 根据时分秒创建时间
LocalTime time1 = LocalTime.of(13, 45, 20);
System.out.println(time1.getHour()); // 13
System.out.println(time1.getMinute()); // 45
System.out.println(time1.getSecond()); // 20

// 通过日期或时间字符串创建日期或时间
LocalDate date2 = LocalDate.parse("2014-03-18");
LocalTime time2 = LocalTime.parse("13:45:20");

LocalDateTime

直接创建LocalDateTime对象或通过合并日期和时间的方式创建

// 直接创建日期时间
LocalDateTime lt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);

// 通过日期和时间创建
LocalDate date1 = LocalDate.of(2014, 3, 18);
LocalTime time1 = LocalTime.of(13, 45, 20);
LocalDateTime lt2 = LocalDateTime.of(date1, time1);
LocalDateTime lt3 = date1.atTime(13, 45, 20);
LocalDateTime lt4 = date1.atTime(time1);
LocalDateTime lt5 = time1.atDate(date1);

// 从日期时间中提取日期和时间
LocalDate date2 = lt1.toLocalDate();
LocalTime time2 = lt1.toLocalTime();

Instant

机器的日期和时间格式

// 获取当前时刻时间戳
System.out.println(Instant.now().toEpochMilli()); // 1534255959679

时间段

Duration & Period

Druation时间间隔单位是时分秒,Period时间间隔单位年月日

创建Duration和Period对象

LocalDate date1 = LocalDate.parse("2018-08-12");
LocalDate date2 = LocalDate.parse("2018-08-11");
LocalTime time1 = LocalTime.parse("12:45:20");
LocalTime time2 = LocalTime.parse("12:45:21");
Instant instant1 = Instant.ofEpochSecond(22);
Instant instant2 = Instant.ofEpochSecond(11);

// 时间间隔是时间秒
Duration d2 = Duration.between(time1, time2); // time2 - time1
Duration d3 = Duration.between(instant1, instant2); // instant2 - instant1
Duration d4 = Duration.ofMinutes(3); // 创建一个3分钟的时间段
System.out.println(d2.getSeconds()); // 1
System.out.println(d4.getSeconds()); // 180

// 时间间隔是年月日
Period p1 = Period.between(date1, date2); // date2 - date1
Period p2 = Period.ofDays(10);
System.out.println(p1.getDays()); // -1
System.out.println(p2.getDays()); // 10

操纵、解析和格式化日期

修改LocalDate对象属性

LocalDate date1 = LocalDate.of(2014, 3, 18);

// 以比较直观的方式修改
LocalDate date1 = date1.withYear(2011); // 修改年
LocalDate date1 = date1.withMonth(11); // 修改月
LocalDate date1 = date1.withDayOfMonth(25); // 修改日

// 以相对方式修改
date1.minusYears(1); // 减1年
date1.plusYears(2); // 加2年
date1.plus(3, ChronoUnit.MONTHS); // 加3月
date1.plus(22, ChronoUnit.DAYS); // 加22天

TemporalAdjuster

LocalDate date1 = LocalDate.of(2014, 3, 18);

// 当前日期之后包括当前日期的第一个星期日
System.out.println(date1.with(nextOrSame(DayOfWeek.SUNDAY))); // 2014-03-23

// 当月第一个星期日
System.out.println(date1.with(firstInMonth(DayOfWeek.SUNDAY))); // 2014-03-02
// 当月最后一个星期日
System.out.println(date1.with(lastInMonth(DayOfWeek.SUNDAY))); // 2014-03-30
// 当月第一天
System.out.println(date1.with(firstDayOfMonth())); // 2014-03-01
// 当月最后一天
System.out.println(date1.with(lastDayOfMonth())); // 2014-03-31

// 当年第一天
System.out.println(date1.with(firstDayOfYear())); // 2014-01-01
// 明年第一天
System.out.println(date1.with(firstDayOfNextYear())); // 2015-01-01

定制一个TemopralAdjuster

求下一个工作日

当前日期如果是周日到周四,日期向后移1天 当前日期如果是周五或周六,日期移到下周一

方案一:实现一个TemporalAdjuster类

public class NextWorkingDay implements TemporalAdjuster {
    @Override
    public Temporal adjustInto(Temporal temporal) {
        // 当前日期是周几
        DayOfWeek dow =
                DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
        // 判断要向后移几天
        int dayToAdd = 1;
        if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;
        else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;
        return temporal.plus(dayToAdd, ChronoUnit.DAYS);
    }
}

方案二:直接使用Lambda使用

LocalDate nextWorkingDate = LocalDate.now()
    .with(temporal -> {
        // 当前日期是周几
        DayOfWeek dow =
            DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
        // 判断要向后移几天
        int dayToAdd = 1;
        if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;
        else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;
        return temporal.plus(dayToAdd, ChronoUnit.DAYS);
    });

方案三:使用Lambda实现一个TemporalAdjuster

TemporalAdjuster nextWorkingDay = TemporalAdjusters.ofDateAdjuster(
    temporal -> {
        // 当前日期是周几
        DayOfWeek dow =
            DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
        // 判断要向后移几天
        int dayToAdd = 1;
        if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;
        else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;
        return temporal.plus(dayToAdd, ChronoUnit.DAYS);
    }
);

输出及解析日期时间对象

LocalDate date1 = LocalDate.of(2014, 3, 18);
System.out.println(date1.format(DateTimeFormatter.BASIC_ISO_DATE)); // 20140318
System.out.println(date1.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2014-03-18

LocalDate date2 = LocalDate.parse("20140318", DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date3 = LocalDate.parse("2014-03-18", DateTimeFormatter.ISO_LOCAL_DATE);

// 按照某个模式创建DateTimeFormatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
System.out.println(date1.format(formatter)); // 2014/03/18
LocalDate date4 = LocalDate.parse("2018/08/14", formatter);

// 创建一个本地化的DateTimeFormatter
DateTimeFormatter italianFormatter =
    DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.ITALIAN);
System.out.println(date1.format(italianFormatter)); // 18. marzo 2014
LocalDate date5 = LocalDate.parse("18. marzo 2014", italianFormatter);

时区与历法

ZoneId

// 打印所有时区
ZoneId.getAvailableZoneIds().stream()
	.forEach(System.out::println);

// 创建一个时区,格式为{区域}/{城市}
ZoneId romeZone = ZoneId.of("Europe/Rome");

// 将老的时区对象转换为ZoneId
ZoneId newZoneId = TimeZone.getDefault().toZoneId();

//  获取当前时区
ZoneId defaultZoneId = ZoneId.systemDefault();
System.out.println(defaultZoneId); // Asia/Shanghai

ZonedDateTime

为时间点添加时区信息

ZoneId romeZone = ZoneId.of("Europe/Rome");

// 为时间点添加时区信息
LocalDate date1 = LocalDate.now();
ZonedDateTime zdt1 = date1.atStartOfDay(romeZone);

LocalDateTime dateTime1 = LocalDateTime.now();
ZonedDateTime zdt2 = dateTime1.atZone(romeZone);

Instant instant1 = Instant.now();
ZonedDateTime zdt3 = instant1.atZone(romeZone);

// 将LocalDateTime转换为Instant
Instant instantFromDateTime = dateTime1.toInstant(ZoneOffset.ofHours(0));
// 将Instant转换为LocalDateTime
LocalDateTime dateTimeFromInstant = LocalDateTime.ofInstant(instant1, romeZone);

ZoneOffset

利用和UTC/格林尼治时间的固定偏差计算时区

// 不推荐使用
// 纽约落后于伦敦5小时
ZoneOffset newYorkOffset = ZoneOffset.of("-05:00");
System.out.println(newYorkOffset);
OffsetDateTime dateTimeInNewYork = OffsetDateTime.of(LocalDateTime.now(), newYorkOffset);

别的日历系统

ISO-8601日历系统是世界文明日历系统的事实标准。Java 8 还提供了4种其他日历系统,分别是

ThaiBuddhistDate
MinguoDate
JapaneseDate
HijrahDate  // 伊斯兰教日历

所有这些类以及LocalDate都实现了ChronoLocalDate接口。

LocalDate date1 = LocalDate.now();
JapaneseDate japaneseDate = JapaneseDate.from(date1);
System.out.println(japaneseDate); // Japanese Heisei 30-08-14

Chronology japaneseChronology = Chronology.ofLocale(Locale.JAPAN);
ChronoLocalDate now = japaneseChronology.dateNow();
System.out.println(now); // 2018-08-14

© 著作权归作者所有

共有 人打赏支持
yysue
粉丝 27
博文 268
码字总数 155357
作品 0
济南
程序员
私信 提问
Java 8时间和日期API 20例

伴随lambda表达式、streams以及一系列小优化,Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API。Java处理日期、日历和时间的方式一直为社区所诟病,将...

黄梦巍
2015/06/19
0
0
Java 8新的时间日期库的20个使用示例

除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学习如何使用Java 8的这套API。Java对日期,日历及时间的...

清尘V
2015/03/17
0
0
java8中的时间处理0 - api介绍

Java 8 Date Time API是我们java开发一直寻找的时间处理工具。java从一开始设计的时间类就让人头疼,好在现在终于有了java8。 为什么我们需要这套API 只要是有这么几个理由: Java的日期和时...

davelet
02/22
0
0
fbf的书单,欢迎分享,欢迎更新

本人看过的以下书值得推荐的,列出来的就是值得推荐的 这个颜色是一般推荐 这个颜色是强烈推荐 这个颜色是神作,收藏吧 物联网:生产力的变革 李虹著 开拓视野,一般 源码中国:全球IT外包新原...

fbf
2015/03/16
0
0
Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Sentry使用

Sentry使用 以django为例.实际上sentry本身文档已经有介绍了.这里只是再总结 1、全局异常捕获 此方法可以全局捕获任何的异常(甚至包括你自己raise的异常),在实际使用过程中不太推荐.但胜在快...

_Change_
18分钟前
1
0
linux系统包管理工具详解 yum rpm apt-get pip wget

在Linux系统下,根据系统版本的不同会有各种各样的包管理工具,下面就简单的梳理一下这几种安装命令. 1、yum Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora、RedHat、CentOS中的...

huoyoung
21分钟前
1
0
阿里巴巴Dubbo实现的源码分析

1. Dubbo概述 Dubbo是阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的方案。它的核心功能包括: #remoting:远程通讯基础,提...

别打我会飞
22分钟前
5
0
tomcat的maxThreads、acceptCount(最大线程数、最大排队数)

tomcat 6的Connector配置如下: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads......

为了美好的明天
25分钟前
2
0
阿里P9架构师谈:高并发网站的监控系统选型、比较、核心监控指标

在高并发分布式环境下,对于访问量大的业务、接口等,需要及时的监控网站的健康程度,防止网站出现访问缓慢,甚至在特殊情况出现应用服务器雪崩等场景,在高并发场景下网站无法正常访问的情况...

架构师springboot
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部