Java 8 新日期时间 API ( 上 ) – 本地日期时间

引言

作为开发者,经常需要处理日期时间。如果你跟随者 Java 5 一路走来,那么一定会对 java.util.Date 、java.util.Calendar 、java.util.GregoiranCalendarjava.text.SimpleDateFormat 四大类非常熟悉,它们分别用于处理日期、日历、日历表示、日期时间格式化。

这四个类,对于编程老人来讲,应该是习惯了,但对于编程新人来讲,就有好多疑问,有好多陷阱和坑等着它们跳,比如

1、 非线程安全:java.util.Date 并不是线程安全的。开发者在使用这个类时必须自己处理多线程并发问题。
2、 设计不佳 :一方面日期和日期格式化分布在多个包中。另一方面,java.util.Date 的默认日期,年竟然是从 1900 开始,月从 1 开始,日从 0 开始,没有统一性。而且 Date 类也缺少直接操作日期的相关方法。
3、 时区处理困难:因为设计不佳,开发人员不得不编写大量代码来处理时区问题。
4、 还有其它一些问题

面对种种问题,Java 8 终于重新设计了所有日期时间、日历及时区相关的 API。并把它们都统一放置在 java.time 包和子包下。并作出了以下改进

1、 新的日期时间 API 是线程安全的。不仅没有 setter 方法,而且任何对实例的变更都会返回一个新的实例而保证原来的实例不变。
2、 新的日期时间 API 提供了大量的方法,用于修改日期时间的各个部分,并返回一个新的实例。
3、 在时区方面,新的日期时间 API 引入了 域 ( domain ) 这个概念。

同时 Java 8 还针对原来复杂的 API 进行重新组合和拆分,分成了好多个类。本章接下来的章节,我们就来详细介绍其中几个最重要的。

本地日期时间 API

Java 8 为处理本地的日期时间提供了三个类 LocalDate 、LocalTimeLocalDateTime。分别用于处理 本地日期、本地时间 和 本地日期时间。

当使用这三个类时,开发者并不需要关心时区是什么。因为它默认使用的是操作系统的时区。


import org.junit.jupiter.api.Test;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.format.DateTimeFormatter;/*** Java 8 为处理本地的日期时间提供了三个类 LocalDate 、LocalTime 和 LocalDateTime。分别用于处理 本地日期、本地时间 和 本地日期时间。*/
public class TimeTest {@Testpublic void LocalDateTimeTest() {/*** 使用 LocalDateTime.now() 方法返回当前的日期时间。*/LocalDateTime currentTime = LocalDateTime.now();System.out.println("当前日期时间: " + currentTime);/*运行结果:当前日期时间: 2021-09-09T10:50:13.623*//*** 调用 LocalDateTime 对象的 toLocalDate() 方法和 toLocalTime() 分别返回当前的日期和当前的时间,也就是 LocalDate 和 LocalTime 两个类的实例*/LocalDate date = currentTime.toLocalDate();System.out.println("当前日期: " + date);LocalTime time = currentTime.toLocalTime();System.out.println("当前时间: " + time);/*运行结果:当前日期: 2021-09-09当前时间: 10:51:41.581*//*** 调用 LocalDateTime 对象的 getMonth() 方法返回当前的月份,调用 getDayOfMonth() 返回当前的日期,调用 getSecond() 返回当前时间的秒数*/int year = currentTime.getYear();System.out.println("当前年份: " + year);int month = currentTime.getMonthValue();System.out.println("当前月份: " + month);int day = currentTime.getDayOfMonth();System.out.println("当前月中的第几天: " + day);int hour = currentTime.getHour();System.out.println("当前小时: " + hour);int minute = currentTime.getMinute();System.out.println("当前分钟: " + minute);int seconds = currentTime.getSecond();System.out.println("当前秒数: " + seconds);int nano = currentTime.getNano();System.out.println("当前毫秒数: " + nano);/*运行结果:当前年份: 2021当前月份: 9当前月中的第几天: 9当前小时: 11当前分钟: 24当前秒数: 57当前毫秒数: 309000000*//*** 可以调用 LocalDateTime 对象的withDayOfMonth() 修改日并返回一个新的实例,调用 withYear() 修改年,调用其它 with* 方法修改其它属性。*/LocalDateTime date2 = currentTime.withYear(2012).withMonth(12).withDayOfMonth(12).withHour(12).withMinute(12).withSecond(12).withNano(121212122);System.out.println("新的日期时间: " + date2);System.out.println("原来的日期时间: " + currentTime);/*运行结果:新的日期时间: 2012-12-12T12:12:12.121212122原来的日期时间: 2021-09-09T11:18:59.409总结:原先的实例并没有被修改*//*** 新的日期时间 API 还大量引入了 of() 方法,比如我们可以调用 LocalDate.of() 方法创建一个日期实例,调用 LocalTime.of() 方法创建一个时间实例。*/// 2022-10-01LocalDate date1 = LocalDate.of(2022, Month.OCTOBER, 01);System.out.println("日期是: " + date1);// 22:15LocalTime time1 = LocalTime.of(22, 15);System.out.println("时间是: " + time1);/*运行结果:日期是: 2022-10-01时间是: 22:15*//*** 可以调用 LocalDateTime.parse() 、LocalDate.parse() 和 LocalTime.parse() 方法解析字符串格式的日期时间、日期和时间。*/LocalDateTime datetime = LocalDateTime.parse("2012-10-10T21:58:00");System.out.println("日期时间是:" + datetime);LocalDate date3 = LocalDate.parse("2022-10-10");System.out.println("日期是: " + date3);LocalTime time3 = LocalTime.parse("22:58:01");System.out.println("时间是: " + time3);/*运行结果:日期时间是:2012-10-10T21:58日期是: 2022-10-10时间是: 22:58:01*//*** 可以调用 DateTimeFormatter.ofPattern 自定义解析器,其中有很多定义好的解析器可以使用*/LocalDate parseDate = LocalDate.parse("2020/12/02", DateTimeFormatter.ofPattern("yyyy/MM/dd"));System.out.println("解析后的时间: " + parseDate);String formatDate = parseDate.format(DateTimeFormatter.ofPattern("yyyy//MM//dd"));System.out.println("格式化后的时间: " + formatDate);/*运行结果:解析后的时间: 2020-12-02格式化后的时间: 2020//12//02*/}}

Java 8 新日期时间 API ( 上 ) – 本地日期时间相关推荐

  1. 怎么网络同步计算机的本地时间,VBA实现本地计算机时间与网服务器时间的同步...

    时 间:2018-04-04 18:56:17 作 者:摘 要:    VBA实现本地计算机时间与网服务器时间的同步. 正 文: 电脑时间走时不准是出了名的.它一般是以廉价的振荡电路或石英钟为基础,每 ...

  2. java 利用新浪天气API获取天气预报

    新浪为我们提供了天气预报获取接口API  http://php.weather.sina.com.cn/xml.php?city=武汉&password=DJOYnieT8234jlsK&am ...

  3. android 计算到期日期,在Android上计算日期

    我正在为Android构建一个应用程序,我需要存储一天并计算到那一天到来的天数. 我将这一天存储在共享的首选项上.首先,我初始化日历. Calendar next = Calendar.getInst ...

  4. 《Java 8 in Action》Chapter 12:新的日期和时间API

    在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类.同时这个类还有两个很大的缺点:年份的起始选择是1900年,月份的起始从0开始. 在Java 1.1中,Date类中的很多 ...

  5. Java日期时间API

    日期时间API 参考:https://lw900925.github.io/java/java8-newtime-api.html 旧日期时间API System java.lang.System类提 ...

  6. 重学Java8新特性(四) : 日期时间API、LocalDateTime、DateTimeFormatter、开发中时间工具类(常用)

    文章目录 一.JDK8中日期时间API的介绍 1.1.LocalDate.LocalTime.LocalDateTime的使用 2.2.Instant类的使用 2.3.DateTimeFormatte ...

  7. 《Java8实战》笔记(12):新的日期和时间API

    新的日期和时间API 相信大多数有经验的程序员都会赞同Java 8之前的库对日期和时间的支持就非常不理想.值得高兴的是 Java 8中引入全新的日期和时间API就是要解决这一问题. Java 8之前的 ...

  8. 【Java8新特性】关于Java8中的日期时间API,你需要掌握这些!!

    写在前面 Java8之前的日期和时间API,存在一些问题,比如:线程安全的问题,跨年的问题等等.这些问题都在Hava8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大.立志 ...

  9. 静态方法:关于Java8中的日期时间API,你需要掌握这些!!

    Java8之前的日期和时间API,存在一些问题,比如:线程安全的问题,跨年的问题等等.这些问题都在Hava8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大.立志成为架构师 ...

  10. 史上最全Java 8新特性总结,助你在工作事半功倍

    1.Lambda表达式 1.初体验 目标:了解使用匿名内部类存在的问题,体验Lambda 匿名内部类存在的问题:当需要启动一个线程去完成任务时,通常会通过Runnable 接口来定义任务内容,并使用T ...

最新文章

  1. 全卷积神经网路【U-net项目实战】论文中U-Net网络实现
  2. 【matlab】面积图(area函数的应用)
  3. 关于SVN 目录结构
  4. 非域计算机上模拟域用户,App-V如何让非域内(工作组)PC 也能享受应用程序虚拟化...
  5. ComboBox 强制转换为大写的方法
  6. 关于spfile的一个难题
  7. CoolHC Volume 1 By CoolFire
  8. 贾俊平统计学思维导图- 第九章 分类数据分析
  9. eclipse常用快捷键和设置
  10. 032-OpenCV模板匹配单个对象、多个对象
  11. 天池项目总结,特征工程了解一下!
  12. MongoDB实验练习题
  13. 火车头采集器使用‘导入数据库’形式发布数据到帝国CMS数据库的过程(原创)适用于ECMS7.2
  14. backtrader概念(二)Trade
  15. 玩转Java 8 Stream 系列二进阶(Collectors.mapping 、Collectors.reducing、Collectors.summarizingInt等)
  16. armel、armhf和arm64
  17. spring-cloud服务监控
  18. 单缓冲、双缓冲、循环缓冲
  19. perl中our的用法
  20. 测试画面帧率及帧延时一种方法

热门文章

  1. “我爱淘”冲刺阶段Scrum站立会议3
  2. 详解IOS开发应用之并发Dispatch Queues
  3. 心路历程19 -- 回顾整个历程 by tsui
  4. Rearchitect Your Web Applications for Microsoft ASP.NET 2.0
  5. 使用Python来调用电脑音响
  6. Cocos2d-x音乐和音效概述
  7. VXLAN详解(三)
  8. 虚拟机和电脑共享文件夹
  9. [POJ 3984] 迷宫问题(BFS最短路径的记录和打印问题)
  10. ​老男孩教育每日一题-第73天 -基础命令点:可恶的^C