告别jodatime!拥抱Java8日期时间类LocalDate、LocalDateTime详解(中)

简介: 告别jodatime!拥抱Java8日期时间类LocalDate、LocalDateTime详解

plusMonths

返回此副本LocalDate添加了几个月的指定数目。

此方法将分三步指定金额的几个月字段:


  • 将输入的月数加到month-of-year字段
  • 校验结果日期是否无效
  • 调整 day-of-month ,如果有必要的最后有效日期


例如,2007-03-31加一个月会导致无效日期2007年4月31日。并非返回一个无效结果,而是 2007-04-30才是最后有效日期。调用实例的不可变性不会被该方法影响。

image.png


当天的零点、结束时间

// 2021-06-30 00:00:00
LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
String formatString = todayStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 2021-06-30 23:59:59
LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
formatString = todayEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

4 创建对象

工厂方法


新API中的所有核心类都是通过熟练的工厂方法构造。

  • 当通过其构成域构造值时,称为工厂of
  • 从其他类型转换时,工厂称为from
  • 也有将字符串作为参数的解析方法。

image.png


getter约定

  • 为了从Java SE 8类获取值,使用了标准的Java getter约定,如下
  • image.png

更改对象值

也可以更改对象值以执行计算。因为新API中所有核心类都是不可变的,所以将调用这些方法with并返回新对象,而不是使用setter。也有基于不同字段的计算方法。

image.png


调整器


新的API还具有调整器的概念—一块代码块,可用于包装通用处理逻辑。可以编写一个WithAdjuster,用于设置一个或多个字段,也可编写一个PlusAdjuster用于添加或减去某些字段。值类还可以充当调节器,在这种情况下,它们将更新它们表示的字段的值。内置调节器由新的API定义,但是如果您有想要重用的特定业务逻辑,则可以编写自己的调节器。


import static java.time.temporal.TemporalAdjusters.*;
LocalDateTime timePoint = ...
foo = timePoint.with(lastDayOfMonth());
bar = timePoint.with(previousOrSame(ChronoUnit.WEDNESDAY));
// 使用值类作为调整器
timePoint.with(LocalTime.now()); 

5 截断

新的API通过提供表示日期,时间和带时间的日期的类型来支持不同的精确度时间点,但是显然,精确度的概念比此精确度更高。

该truncatedTo方法存在支持这种使用情况下,它可以让你的值截断到字段,如下

LocalTime truncatedTime = time.truncatedTo(ChronoUnit.SECONDS);


6 时区


我们之前查看的本地类抽象了时区引入的复杂性。时区是一组规则,对应于标准时间相同的区域。大约有40个。时区由它们相对于协调世界时(UTC,Coordinated Universal Time)的偏移量定义。它们大致同步移动,但有一定差异。


时区可用两个标识符来表示:缩写,例如“ PLT”,更长的例如“ Asia / Karachi”。在设计应用程序时,应考虑哪种情况适合使用时区,什么时候需要偏移量。


ZoneId是区域的标识符。每个ZoneId规则都对应一些规则,这些规则定义了该位置的时区。在设计软件时,如果考虑使用诸如“ PLT”或“ Asia / Karachi”之类的字符串,则应改用该域类。一个示例用例是存储用户对其时区的偏好。


image.png


  • ZoneOffset是格林威治/ UTC与时区之间的差异的时间段。可在特定的ZoneId,在特定时间被解析,如清单7所示。


ZoneOffset offset = ZoneOffset.of("+2:00");
目录
相关文章
|
8天前
|
安全 Java 编译器
JAVA泛型类的使用(二)
接上一篇继续介绍Java泛型的高级特性。3. **编译时类型检查**:尽管运行时发生类型擦除,编译器会在编译阶段进行严格类型检查,并允许通过`extends`关键字对类型参数进行约束,确保类型安全。4. **桥方法**:为保证多态性,编译器会生成桥方法以处理类型擦除带来的问题。5. **运行时获取泛型信息**:虽然泛型信息在运行时被擦除,但可通过反射机制部分恢复这些信息,例如使用`ParameterizedType`来获取泛型参数的实际类型。
|
8天前
|
安全 Java 编译器
JAVA泛型类的使用(一)
Java 泛型类是 JDK 5.0 引入的重要特性,提供编译时类型安全检测,增强代码可读性和可维护性。通过定义泛型类如 `Box<T>`,允许使用类型参数。其核心原理是类型擦除,即编译时将泛型类型替换为边界类型(通常是 Object),确保与旧版本兼容并优化性能。例如,`Box<T>` 编译后变为 `Box<Object>`,从而实现无缝交互和减少内存开销。
|
1月前
|
Java API 调度
Java 日期与时间处理:精准掌控时间流转
Java 8引入了全新的日期和时间API,解决了旧版`java.util.Date`和`Calendar`类设计不佳、操作繁琐的问题。新API包括`LocalDate`、`LocalTime`和`LocalDateTime`类,操作简洁直观,符合日常思维习惯。同时提供了`Period`和`Duration`处理时间间隔,以及`DateTimeFormatter`进行格式化输出。这些改进使开发者能更高效、准确地处理日期和时间,极大提升了开发效率与代码质量。 (239字符)
71 6
|
2月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
3月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
76 26
|
3月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
104 8
|
3月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
201 58
|
4月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
68 2
|
4月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
66 3
|
4月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
72 1

热门文章

最新文章