网站首页 > java教程 正文
Java 8的一个重要新增特性就是引入了新的时间和日期API,它们被包含在java.time包中。借助新的时间和日期API可以以更简洁的方法处理时间和日期。
Java 8的时间是基于ISO日历系统,该系统是遵循通用格里高利规则的实际世界日历。所有的类都是不可变的并且是线程安全的。今天主要介绍日期和时间类中的LocalDate、LocalTime、Instant、Duration以及Period等。
Dates and Times
Instant
Instant实质是一个数字时间戳,可以从当前的Clock中获取。与我们常使用的System.currentTimeMillis()有些类似,不过Instant可以精确到纳秒(Nano-Second),System.currentTimeMillis()方法只精确到毫秒(Milli-Second)。
Instant instant = Instant.now();
instant.getNano(); // nanoseconds
instant.getEpochSecond(); // 当前的绝对秒
Instant instant = Instant.ofEpochSecond(120, 100000);
ofEpochSecond()方法的第一个参数为秒,第二个参数为纳秒,上面的代码表示从1970-01-01 00:00:00开始后两分钟的10万纳秒的时刻
LocalDate
LocalDate存储的是日期,它不带有时间,所以你可以用它来存"2020-05-01"这样节日。
LocalTime
LocalTime存储的是时间,它不带有日期,即"09:30:31"这样的的时间点。
LocalDateTime
LocalDateTime则同时存储日期和时间,如"2010-12-03T11:30:01"。
ZonedDateTime
ZonedDateTime在存储日期和时间的同时,还带有时区。如"2017-01-05T15:26:56.147+08:00[Asia/Shanghai]
". 其中2017-01-05T15:26:56.147部分为LocalDateTime,+08:00[Asia/Shanghai]部分为ZoneId。如果可以,还是尽量使用不带时区的方法类,它能避免你的应用复杂化。
// 构建对象
LocalDateTime localDateTime = LocalDateTime.now(); // 2020-05-23T17:14:26.035
LocalDate localDate = localDateTime.toLocalDate(); // 2020-05-23
LocalTime localTime = localDateTime.toLocalTime(); // 17:14:26.035
DateTimeFormatter DAY_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse("2020-05-01 12:30:31", DAY_TIME_FORMAT);
LocalDateTime localDateTime = LocalDateTime.of(2017, Month.JANUARY, 4, 17, 23, 52);
// 比较&运算
if (localDate.isAfter(anthorLocalDate.minusDays(1L))) {}
// format
DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd");
localDate.format(DATE_FORMAT); //20200523
Duration and Period
Duration是沿时间轴以纳秒为单位的时间的简单度量。 Period以对人类有意义的单位表示时间量,例如年或天。
LocalDateTime from = LocalDateTime.of(2017, Month.JANUARY, 5, 10, 7, 0); // 2017-01-05 10:07:00
LocalDateTime to = LocalDateTime.of(2017, Month.FEBRUARY, 5, 10, 7, 0); // 2017-02-05 10:07:00
Duration duration = Duration.between(from, to); // 表示从 2017-01-05 10:07:00 到 2017-02-05 10:07:00 这段时间
long days = duration.toDays(); // 这段时间的总天数
long hours = duration.toHours(); // 这段时间的小时数
long minutes = duration.toMinutes(); // 这段时间的分钟数
long seconds = duration.getSeconds(); // 这段时间的秒数
long milliSeconds = duration.toMillis(); // 这段时间的毫秒数
long nanoSeconds = duration.toNanos(); // 这段时间的纳秒数
// 2020-04-01 到 2020-05-23 这段时间
Period period = Period.between(
LocalDate.of(2020, 04, 01),
LocalDate.of(2020, 05, 23));
System.out.println(period.getDays()); // 22
System.out.println(period.getMonths());// 1
System.out.println(period.getYears()); // 0
Additional value types
除了上述的时间,日期等,还提供了年/月/日等类型。如
- Month: 它是一个枚举值,表示一年的12个月:January, February, March, April, May, June, July, August, September, October, November and December.
- DayOfWeek: 枚举类型,表示一周中的七天:Monday, Tuesday, Wednesday, Thursday, Friday, Saturday and Sunday.
- Year: 不可变的日期,表示年。有了Year之后判断闰年就简单多了。
- YearMonth: 表示年月,在ISO-8601日历系统中表示诸如"2020-05"。
- MonthDay: 表示月和天,而不带有年和时间,"--12-03"。
- OffsetTime: 不可变的日期时间对象,通常用来表示"hour-minute-second"的offset, 如"10:15:30+01:00"。
- OffsetDateTime: 是日期时间再加上 offset(ISO-8601日历系统中与的UTC /格林威治时间偏移)的一个对象。
LocalDateTime localDateTime = LocalDateTime.now(); // 2020-05-23T17:14:26.035
LocalDate localDate = localDateTime.toLocalDate(); // 2020-05-23
int year = localDate.getYear(); // 2020
Month month = localDate.getMonth(); // 月份:MAY
int dayOfMonth = localDate.getDayOfMonth(); // 月份中的第几天:23
DayOfWeek dayOfWeek = localDate.getDayOfWeek(); // 一周的第几天:SATURDAY
int length = localDate.lengthOfMonth(); // 月份的天数:31
boolean leapYear = localDate.isLeapYear(); // 是否为闰年:true
method
尽管各种日期时间类的方法众多,但许多方法可以都使用一致的前缀命名。
- of: 静态工厂方法,如 LocalDateTime.of(2017, Month.JANUARY, 5, 10, 7, 0);
- parse:静态工厂方法基于parsing
LocalDateTime.parse("2020-05-01 12:30:31", DAY_TIME_FORMAT);
- get:获取某值,localDateTime.getYear()
- is:检查某值是否成立,如 year.isLeap()
- with: 相当于setter的作用
LocalDate date = LocalDate.parse("2020-05-23");
//获取这个月的第一个周末的时间
date.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.SUNDAY)));//2020-05-03
- plus: 给某值加上一个值,如 localDate.plusDays(1)
- minus: 给某值加上一个值 如 localDate.minusYears()
- to: 对象转换: LocalDate localDate = localDateTime.toLocalDate(); 将时间日期转化为时间
猜你喜欢
- 2024-11-11 整理一波Mysql中易忘基础知识点和也许你也会踩的一些坑
- 2024-11-11 Idea安装通义灵码教程(idea安装使用教程)
- 2024-11-11 「开发者成长」不要在网上乱拷贝代码了
- 2024-11-11 java 8 新的时间和日期 API(java对日期的处理)
- 2024-11-11 如何正常掌握MySql时间处理函数的学习与实践,看了这篇就够了
- 2024-11-11 一段网上找的代码突然爆了,项目出现大Bug
- 2024-11-11 python之time模块详细梳理(python中time模块详解)
- 2024-11-11 网上找的一段代码突然爆了,项目出现大Bug
- 2024-11-11 LeetCode基础算法题第166篇:1185. 给定一个日期求星期几
- 2024-11-11 现代与传统日期时间处理工具概览(时间 日期)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)