更深入地了解Java 8 Date and Time API

在这篇文章中,我们将更深入地了解通过Java 8获得的新的Date / Time API(
JSR 310 )。 请注意,本文主要由显示新API功能的代码示例驱动。 我认为这些示例是不言自明的,因此我并没有花太多时间在它们周围写文本:-)

让我们开始吧!

处理日期和时间对象

Java 8 Date / Time API的所有类都位于java.time包内。 我们要看的第一类是java.time.LocalDate。 LocalDate表示没有时间的年月日日期。 我们从创建新的LocalDate实例开始:

// the current date
LocalDate currentDate = LocalDate.now();// 2014-02-10
LocalDate tenthFeb2014 = LocalDate.of(2014, Month.FEBRUARY, 10);// months values start at 1 (2014-08-01)
LocalDate firstAug2014 = LocalDate.of(2014, 8, 1);// the 65th day of 2010 (2010-03-06)
LocalDate sixtyFifthDayOf2010 = LocalDate.ofYearDay(2010, 65);

LocalTime和LocalDateTime是我们要研究的下一个类。 两者的工作都类似于LocalDate。 LocalTime可用于时间(无日期),而LocalDateTime可将日期和时间组合在一个类中:

LocalTime currentTime = LocalTime.now(); // current time
LocalTime midday = LocalTime.of(12, 0); // 12:00
LocalTime afterMidday = LocalTime.of(13, 30, 15); // 13:30:15// 12345th second of day (03:25:45)
LocalTime fromSecondsOfDay = LocalTime.ofSecondOfDay(12345);// dates with times, e.g. 2014-02-18 19:08:37.950
LocalDateTime currentDateTime = LocalDateTime.now();// 2014-10-02 12:30
LocalDateTime secondAug2014 = LocalDateTime.of(2014, 10, 2, 12, 30);// 2014-12-24 12:00
LocalDateTime christmas2014 = LocalDateTime.of(2014, Month.DECEMBER, 24, 12, 0);

默认情况下,LocalDate / Time类将使用默认时区中的系统时钟。 我们可以通过提供时区或其他Clock实现来更改此设置:

// current (local) time in Los Angeles
LocalTime currentTimeInLosAngeles = LocalTime.now(ZoneId.of("America/Los_Angeles"));// current time in UTC time zone
LocalTime nowInUtc = LocalTime.now(Clock.systemUTC());

从LocalDate / Time对象中,我们可以获得所需的各种有用信息。 一些例子:

LocalDate date = LocalDate.of(2014, 2, 15); // 2014-02-15boolean isBefore = LocalDate.now().isBefore(date); // false// information about the month
Month february = date.getMonth(); // FEBRUARY
int februaryIntValue = february.getValue(); // 2
int minLength = february.minLength(); // 28
int maxLength = february.maxLength(); // 29
Month firstMonthOfQuarter = february.firstMonthOfQuarter(); // JANUARY// information about the year
int year = date.getYear(); // 2014
int dayOfYear = date.getDayOfYear(); // 46
int lengthOfYear = date.lengthOfYear(); // 365
boolean isLeapYear = date.isLeapYear(); // falseDayOfWeek dayOfWeek = date.getDayOfWeek();
int dayOfWeekIntValue = dayOfWeek.getValue(); // 6
String dayOfWeekName = dayOfWeek.name(); // SATURDAYint dayOfMonth = date.getDayOfMonth(); // 15
LocalDateTime startOfDay = date.atStartOfDay(); // 2014-02-15 00:00// time information
LocalTime time = LocalTime.of(15, 30); // 15:30:00
int hour = time.getHour(); // 15
int second = time.getSecond(); // 0
int minute = time.getMinute(); // 30
int secondOfDay = time.toSecondOfDay(); // 55800

无需提供特定日期即可获得某些信息。 例如,如果我们需要有关特定年份的信息,则可以使用Year类:

Year currentYear = Year.now();
Year twoThousand = Year.of(2000);
boolean isLeap = currentYear.isLeap(); // false
int length = currentYear.length(); // 365// sixtyFourth day of 2014 (2014-03-05)
LocalDate date = Year.of(2014).atDay(64);

我们可以使用加号和减号方法来添加或减去特定的时间量。 请注意,这些方法总是返回一个新实例(Java 8日期/时间类是不可变的)。

LocalDate tomorrow = LocalDate.now().plusDays(1);// before 5 houres and 30 minutes
LocalDateTime dateTime = LocalDateTime.now().minusHours(5).minusMinutes(30);

TemporalAdjusters是日期处理的另一种不错的方法。 TemporalAdjuster是一个单一方法接口,用于将调整过程与实际日期/时间对象分开。 可以使用TemporalAdjusters类的静态方法来访问一组常见的TemporalAdjusters 。

LocalDate date = LocalDate.of(2014, Month.FEBRUARY, 25); // 2014-02-25// first day of february 2014 (2014-02-01)
LocalDate firstDayOfMonth = date.with(TemporalAdjusters.firstDayOfMonth());// last day of february 2014 (2014-02-28)
LocalDate lastDayOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());

静态导入使它更通俗易懂:

import static java.time.temporal.TemporalAdjusters.*;...// last day of 2014 (2014-12-31)
LocalDate lastDayOfYear = date.with(lastDayOfYear());// first day of next month (2014-03-01)
LocalDate firstDayOfNextMonth = date.with(firstDayOfNextMonth());// next sunday (2014-03-02)
LocalDate nextSunday = date.with(next(DayOfWeek.SUNDAY));

时区

使用时区是新API简化的另一个重要主题。 到目前为止,我们已经看到的LocalDate / Time类不包含有关时区的信息。 如果我们要使用某个时区中的日期/时间,可以使用ZonedDateTime或OffsetDateTime :

ZoneId losAngeles = ZoneId.of("America/Los_Angeles");
ZoneId berlin = ZoneId.of("Europe/Berlin");// 2014-02-20 12:00
LocalDateTime dateTime = LocalDateTime.of(2014, 02, 20, 12, 0);// 2014-02-20 12:00, Europe/Berlin (+01:00)
ZonedDateTime berlinDateTime = ZonedDateTime.of(dateTime, berlin);// 2014-02-20 03:00, America/Los_Angeles (-08:00)
ZonedDateTime losAngelesDateTime = berlinDateTime.withZoneSameInstant(losAngeles);int offsetInSeconds = losAngelesDateTime.getOffset().getTotalSeconds(); // -28800// a collection of all available zones
Set<String> allZoneIds = ZoneId.getAvailableZoneIds();// using offsets
LocalDateTime date = LocalDateTime.of(2013, Month.JULY, 20, 3, 30);
ZoneOffset offset = ZoneOffset.of("+05:00");// 2013-07-20 03:30 +05:00
OffsetDateTime plusFive = OffsetDateTime.of(date, offset);// 2013-07-19 20:30 -02:00
OffsetDateTime minusTwo = plusFive.withOffsetSameInstant(ZoneOffset.ofHours(-2));

时间戳记

诸如LocalDate和ZonedDateTime之类的类提供了对时间的直观了解。 但是,通常我们需要从机器角度来看待时间。 为此,我们可以使用表示时间戳的Instant类。 Instant会计算从1970年1月1日(1970-01-01 00:00:00)的第一秒(也称为EPOCH )开始的时间。 如果即时值出现在纪元之前,则它们可以为负。 它们遵循ISO 8601表示日期和时间的标准。

// current time
Instant now = Instant.now();// from unix timestamp, 2010-01-01 12:00:00
Instant fromUnixTimestamp = Instant.ofEpochSecond(1262347200);// same time in millis
Instant fromEpochMilli = Instant.ofEpochMilli(1262347200000l);// parsing from ISO 8601
Instant fromIso8601 = Instant.parse("2010-01-01T12:00:00Z");// toString() returns ISO 8601 format, e.g. 2014-02-15T01:02:03Z
String toIso8601 = now.toString();// as unix timestamp
long toUnixTimestamp = now.getEpochSecond();// in millis
long toEpochMillis = now.toEpochMilli();// plus/minus methods are available too
Instant nowPlusTenSeconds = now.plusSeconds(10);

期限和期限

期间和持续时间是另外两个重要的类别。 就像名称所暗示的那样,它们代表时间或数量。 期间使用基于日期的值(年,月,日),而期间使用秒或纳秒来定义时间量。 持续时间最适合使用Instants和机器时间。 如果终点发生在起点之前,则“期间”和“持续时间”可以包含负值。

// periodsLocalDate firstDate = LocalDate.of(2010, 5, 17); // 2010-05-17
LocalDate secondDate = LocalDate.of(2015, 3, 7); // 2015-03-07
Period period = Period.between(firstDate, secondDate);int days = period.getDays(); // 18
int months = period.getMonths(); // 9
int years = period.getYears(); // 4
boolean isNegative = period.isNegative(); // falsePeriod twoMonthsAndFiveDays = Period.ofMonths(2).plusDays(5);
LocalDate sixthOfJanuary = LocalDate.of(2014, 1, 6);// add two months and five days to 2014-01-06, result is 2014-03-11
LocalDate eleventhOfMarch = sixthOfJanuary.plus(twoMonthsAndFiveDays);// durationsInstant firstInstant= Instant.ofEpochSecond( 1294881180 ); // 2011-01-13 01:13
Instant secondInstant = Instant.ofEpochSecond(1294708260); // 2011-01-11 01:11Duration between = Duration.between(firstInstant, secondInstant);// negative because firstInstant is after secondInstant (-172920)
long seconds = between.getSeconds();// get absolute result in minutes (2882)
long absoluteResult = between.abs().toMinutes();// two hours in seconds (7200)
long twoHoursInSeconds = Duration.ofHours(2).getSeconds();

格式化和解析

在处理日期和时间时,格式化和解析是另一个大主题。 在Java 8中,这可以通过使用format()和parse()方法来实现:

// 2014-04-01 10:45
LocalDateTime dateTime = LocalDateTime.of(2014, Month.APRIL, 1, 10, 45);// format as basic ISO date format (20140220)
String asBasicIsoDate = dateTime.format(DateTimeFormatter.BASIC_ISO_DATE);// format as ISO week date (2014-W08-4)
String asIsoWeekDate = dateTime.format(DateTimeFormatter.ISO_WEEK_DATE);// format ISO date time (2014-02-20T20:04:05.867)
String asIsoDateTime = dateTime.format(DateTimeFormatter.ISO_DATE_TIME);// using a custom pattern (01/04/2014)
String asCustomPattern = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));// french date formatting (1. avril 2014)
String frenchDate = dateTime.format(DateTimeFormatter.ofPattern("d. MMMM yyyy", new Locale("fr")));// using short german date/time formatting (01.04.14 10:45)
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(new Locale("de"));
String germanDateTime = dateTime.format(formatter);// parsing date strings
LocalDate fromIsoDate = LocalDate.parse("2014-01-20");
LocalDate fromIsoWeekDate = LocalDate.parse("2014-W14-2", DateTimeFormatter.ISO_WEEK_DATE);
LocalDate fromCustomPattern = LocalDate.parse("20.01.2014", DateTimeFormatter.ofPattern("dd.MM.yyyy"));

转换次数

当然,我们并不总是拥有所需类型的对象。 因此,我们需要一个选项来在彼此之间转换不同的日期/时间相关对象。 以下示例显示了一些可能的转换选项:

// LocalDate/LocalTime <-> LocalDateTime
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTimeFromDateAndTime = LocalDateTime.of(date, time);
LocalDate dateFromDateTime = LocalDateTime.now().toLocalDate();
LocalTime timeFromDateTime = LocalDateTime.now().toLocalTime();// Instant <-> LocalDateTime
Instant instant = Instant.now();
LocalDateTime dateTimeFromInstant = LocalDateTime.ofInstant(instant, ZoneId.of("America/Los_Angeles"));
Instant instantFromDateTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(-2));// convert old date/calendar/timezone classes
Instant instantFromDate = new Date().toInstant();
Instant instantFromCalendar = Calendar.getInstance().toInstant();
ZoneId zoneId = TimeZone.getDefault().toZoneId();
ZonedDateTime zonedDateTimeFromGregorianCalendar = new GregorianCalendar().toZonedDateTime();// convert to old classes
Date dateFromInstant = Date.from(Instant.now());
TimeZone timeZone = TimeZone.getTimeZone(ZoneId.of("America/Los_Angeles"));
GregorianCalendar gregorianCalendar = GregorianCalendar.from(ZonedDateTime.now());

结论

使用Java 8,我们可以在java.time包中获得非常丰富的API,用于处理日期和时间。 该API可以用更新,更灵活的类完全替代旧类,例如java.util.Date或java.util.Calendar。 由于大多数类都是不可变的,因此新的API有助于构建线程安全的系统。

  • 示例的源代码可以在GitHub上找到 。

参考:在mscharhag,Programming and Stuff博客上,我们的JCG合作伙伴 Michael Scharhag 对Java 8 Date and Time API进行了更深入的研究 。

翻译自: https://www.javacodegeeks.com/2014/03/a-deeper-look-into-the-java-8-date-and-time-api.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab怎么提取特征,matlab – 了解提取特征的编码

我关注的编码是fisher编码,因为我已经证明我的工作效果最好.所以我想在我提取的(SIFT)功能上测试Fisher编码,并测试系统的性能,无论是否编码.而不是重新开始我发现vl_feat有一个用于fisher编码的内置库,他们有一个教程,以及链接here现在我已经完成了所需的大部分工作,但实际上编…

【渝粤教育】电大中专药剂学基础知识 (3)作业 题库

1.胶囊剂不检查的项目是&#xff08;&#xff09;。 A.装量差异 B.崩解时限 C.硬度 D.水分 E.外观 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;C 2.成裂片和顶裂的原因正确的是&#xff08;&#xff09;。 A.压力分布的不均匀 B.颗粒中细粉太多 C.颗粒过干 D.弹性…

【渝粤教育】电大中专计算机应用基础_1作业 题库

1.反映计算机存储容量的基本单位是() A.字节 B.字 C.二进制位 D.双字 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.巨型计算机指的是() A.重量大 B.功能强 C.体积大 D.耗电量大 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 3.在微型计算机中,下列…

关于光端机的一些常见术语解释

光端机&#xff0c;就是光信号传输的终端设备。今天飞畅科技的小编就来为大家详细介绍下光端机的类型&#xff0c;接口种类及厂家的术语&#xff0c;感兴趣的朋友就一起来详细了解下吧&#xff01; 一、光端机类型&#xff1a; 光端机&#xff0c;就是将多个E1&#xff08;一种…

php 站内搜索引擎,淘特站内搜索引擎For PhoCmsV9.4

一、产品特点&#xff1a;该产品是淘特站内搜索引擎For PhpCmsV9特别定制版&#xff0c;系统安装后&#xff0c;就可以索引、模糊查询PhpCmsV9的文章数据了(无需连接数据库哦)二、产品下载&#xff1a;三、使用说明&#xff1a;提示&#xff1a;本系统已和tomcat7打包&#xff…

【渝粤教育】电大中专跨境电子商务理论与实务 (31)作业 题库

1.在按照服务类型中&#xff0c;&#xff08;&#xff09;服务平台主要是为境内外会员商户提供网络营销平台&#xff0c;传递供应商或采购商等商家的商品或服务信息&#xff0c;促成双方完成交易。 A.信息服务平台 B.在线交易平台 C.线上服务平台 D.线下交易平台 正确 正确答案…

交换机组网常见九大故障问题

交换机是一种用于电信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。其他常见的还有电话语音交换机、光纤交换机等。那么&#xff0c;交换机组网常见九大故障问题有哪些呢&#xff1f;接下来我们就跟随飞畅科技…

python qtdesigner安装,PyCharm+Qt Designer+PyUIC安装配置教程详解

Qt Designer用于像VC的MFC一样拖放、设计控件PyUIC用于将Qt Designer生成的.ui文件转换成.py文件Qt Designer和PyUIC都包含在PyQt5中&#xff0c;所以我们只需要安装PyQt5塻块然后再指定Qt Designer和PyUIC即可为了避免篇幅过长&#xff0c;本文只讲安装配置&#xff0c;使用可…

国家开放大学2021春1089现代教育思想答案

教育 教育 试卷代号&#xff1a;1089 2 0 2 1年春季学期期末统一考试 现代教育思想 试题答案及评分标准&#xff08;开卷&#xff09; &#xff08;供参考&#xff09; 2021年7月 一、填空题&#xff08;共4题&#xff0c;每空1分&#xff0c;共10分&#xff09; 1&#xff0…

[渝粤教育] 西南科技大学 建筑制图 在线考试复习资料

建筑制图——在线考试复习资料 一、单选题 1.截平面通过锥顶完全截割圆锥时,截交线为( ) A.椭圆 B.抛三角形 C.四边形 D.圆 2.下列说法正确的是( ) A.投影面垂直线满足中心投影规律 B.投影面垂直线可以在两个投影面反映集聚性 C.直线垂直于一个投影面,必然平行于其余两个投影面…

可网管交换机的三种管理方式介绍

交换机的按是否可网管&#xff0c;分为可网管交换机和不可网管交换机&#xff0c;可网管交换机可以通过以下几种途径进行管理&#xff1a;通过RS-232串行口&#xff08;或并行口&#xff09;管理、通过网络浏览器管理和通过网络管理软件管理。接下来就由杭州飞畅科技来为大家详…

ping cat.flag.php,关于2020年强网杯-强网先锋-主动的赛题解析

原标题&#xff1a;关于2020年强网杯-强网先锋-主动的赛题解析一、基本信息(总概述)本题涉及知识点&#xff1a;命令执行正则匹配linux命令绕过二、基本环境和工具Linux系统PHPApacheFirefoxIndex.phpFlag.php三、Writeup1、根据题目要求还原实验环境首先在Linux虚拟机上安装Ap…

使用Prometheus发现在Kubernetes上运行的应用程序

Prometheus支持抓取应用程序的多个实例。 由于其IP地址会发生变化&#xff0c;因此需要动态发现在协调环境中运行的应用程序。 可以将Prometheus配置为使用Kubernetes API动态地发现正在运行的实例列表中的更改。 下面显示了一个简单的Prometheus示例&#xff0c;该示例对具有…

[渝粤教育] 西南科技大学 机械控制工程基础在线考试复习资料

机械控制工程基础在线考试复习资料 一.单项选择题 1.的拉氏变换为&#xff08; &#xff09;。 A. B. C. D. 答案:看左边查询 2.的拉氏变换为&#xff0c;则为&#xff08; &#xff09;。 A. B. C. D. 答案:看左边查询 3.脉冲函数的拉氏变换为&#xff08; &#xff09;。 A.0…

[渝粤教育] 西南科技大学 电子技术基础 在线考试复习资料(1)

电子技术基础——在线考试复习资料 一、单选题 1.一个8选一的数据选择器,其地址输入(选择控制输入)端有( )个 A.1 B.2 C.3 D.4 2.8位移位寄存器,将并行数据经( )个脉冲后,能输出8位串行数据 A.1 B.7 C.4 D.8 3.逻辑函数FABBCCA,则( ) A. B. C. D. 4…

可网管交换机与非网管交换机的区别

交换机的种类按是否可网管&#xff0c;交换机分为可网管交换机和不可网管交换机。那么&#xff0c;可网管交换机与非网管交换机的区别主要体现在哪里呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xff01; 一、可网管交换机与非网管交换机的区别 不可网…

[渝粤教育] 西南科技大学 经济数学2 在线考试复习资料

经济数学2——在线考试复习资料 一、单选题 1.。 A. B. C. D. 2.取( )值时齐次线性方程组有非零解。 A. B. C. D. A. B. C. D. 4.计算排列34125的逆序数后,有( )。 A.逆序数是3, 并为奇排列 B.逆序数为4, 并为奇排列 C.逆序数为4, 并为偶排列 D.逆序数为3, 并为偶排列 A.0 B.…

bloomfilter的java实现,BloomFilter(布隆过滤器)原理及实战详解

什么是 BloomFilter(布隆过滤器)布隆过滤器(英语&#xff1a;Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。主要用于判断一个元素是否在一个集合中。通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景&#xff0c;这…

[渝粤教育] 西南科技大学 计算机工业控制 在线考试复习资料

计算机工业控制——在线考试复习资料 一、单选题 1.某位移测量系统中,位移测量仪表的量程为0-100mm,采用8位 A/D转换器转换后输出为00H~FAH,若位移值为30H,此时A/D转换器输出的数字量为( )。 A.60H B.64H C.6AH D.6FH 2.某位移测量系统中,位移测量仪表的量程为0-100mm,采用8位…

六种让路由器与交换机更加安全的方法

传统的网络安全技术侧重于系统入侵检测&#xff0c;反病毒软件或防火墙。内部安全如何&#xff1f;在网络安全构造中&#xff0c;交换机和路由器是非常重要的&#xff0c;在七层网络中每一层都必须是安全的。很多交换机和路由器都有丰富的安全功能&#xff0c;要了解有些什么&a…