一、简介

  1. 全球一共分为24个时区,伦敦所在的时区称为标准时区,其他时区按东/西偏移的小时区分

  2. 北京所在的时区是东八区GMT+08:00或者UTC+08:00表示东八区。

  3. GMTUTC可以认为基本是等价的,只是UTC使用更精确的原子钟计时,每隔几年会有一个闰秒,我们在开发程序的时候可以忽略两者的误差,因为计算机的时钟在联网的时候会自动与时间服务器同步时间。

  4. Asia/Shanghai,表示上海所在地的时区。特别注意城市名称不是任意的城市,而是由国际标准组织规定的城市。

  5. 夏令时:所谓夏令时,就是夏天开始的时候,把时间往后拨1小时,夏天结束的时候,再把时间往前拨1小时,时间换算更加复杂。我们国家实行过一段时间夏令时,1992年就废除了,但美国到现在还在使用。 计算夏令时请使用标准库提供的相关类,不要试图自己计算夏令时。

  6. 在计算机中,通常使用Locale表示一个国家或地区的日期、时间、数字、货币等格式。

    例如:(语言使用小写,国家使用大写

    • zh_CN表示中文+中国
    • en_US表示英文+美国。
  7. 要获取当前时间戳,可以使用System.currentTimeMillis(),这是Java程序获取时间戳最常用的方法。(计算机存储的当前时间,本质上只是一个不断递增的整数。

  8. 由于Java提供了新旧两套日期和时间的API,除非涉及到遗留代码,否则我们应该坚持使用新的API,新旧转换:博客地址

  9. 标准库API:

    ​ Java标准库有两套处理日期和时间的API,为什么会有新旧两套API呢?因为历史遗留原因,旧的API存在很多问题,所以引入了新的API。

    • java.util包,主要包括DateCalendarTimeZone这几个类;
    • java.time包,Java 8引入,主要包括LocalDateTimeZonedDateTimeZoneId等。

二、旧的Date体系

  1. Date

    java.util.Date是用于表示一个日期和时间的对象,注意与java.sql.Date区分,后者用在数据库中。如果观察Date的源码,可以发现它实际上存储了一个long类型的以毫秒表示的时间戳

    private transient long fastTime;
    

    基本用法:

    // 获取当前时间:
    Date date = new Date();
    System.out.println(date.getYear() + 1900); // 必须加上1900
    System.out.println(date.getMonth() + 1); // 0~11,必须加上1
    System.out.println(date.getDate()); // 1~31,不能加1
    // 转换为GMT时区:
    System.out.println(date.toGMTString());
    // 转换为本地时区:
    System.out.println(date.toLocaleString());
    
  2. SimpleDateFormat

    ​ 对 Date 数据使用预定义的字符串进行格式转换。

    • yyyy:年
    • MM:月
    • dd: 日
    • HH: 小时
    • mm: 分钟
    • ss: 秒

    注意:(具体见 JDK 文档详细格式说明)

    • M:输出9
    • MM:输出09
    • MMM:输出Sep
    • MMMM:输出September
    // 获取当前时间:
    Date date = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println(sdf.format(date));
    
  3. Date弊端

    ​ Date对象有几个严重的问题:它不能转换时区,除了toGMTString()可以按GMT+0:00输出外,Date总是以当前计算机系统的默认时区为基础进行输出。此外,我们也很难对日期和时间进行加减,计算两个日期相差多少天,计算某个月第一个星期一的日期等。

  4. Calender

    Calendar可以用于获取并设置年、月、日、时、分、秒,它和Date比,主要多了一个可以做简单的日期和时间运算的功能。注意到Calendar获取年月日这些信息变成了get(int field),返回的年份不必转换,返回的月份仍然要加1,返回的星期要特别注意,1~7分别表示周日,周一,……,周六。

    ​ 利用Calendar.getTime()可以将一个Calendar对象转换成Date对象,然后就可以用SimpleDateFormat进行格式化了。

  5. TimeZone:时区用TimeZone对象表示。


三、新的 LocalDateTime体系

1、LocalDateTime

  1. 与之前的区别:

    • 和旧的API相比,新API严格区分了时刻、本地日期、本地时间和带时区的日期时间,并且,对日期和时间进行运算更加方便。
    • 此外,新API修正了旧API不合理的常量设计:
      • Month的范围用1~12表示1月到12月;
      • Week的范围用1~7表示周一到周日。
    • 最后,新API的类型几乎全部是不变类型(和String类似),可以放心使用不必担心被修改。
  2. 一些特性:

    • LocalDateTime没有时区,无法确定某一时刻。
    • ZonedDateTime相当于LocalDateTime加时区的组合,它具有时区,可以与long表示的时间戳进行转换。
  3. 当前时间戳在java.time中以Instant类型表示,我们用Instant.now()获取当前时间戳,效果和System.currentTimeMillis()类似。(原此,本质上是一样的)

  4. 简单实现

    public class Main {public static void main(String[] args) {LocalDate d = LocalDate.now(); // 当前日期LocalTime t = LocalTime.now(); // 当前时间LocalDateTime dt = LocalDateTime.now(); // 当前日期和时间System.out.println(d); // 严格按照ISO 8601格式打印System.out.println(t); // 严格按照ISO 8601格式打印System.out.println(dt); // 严格按照ISO 8601格式打印
    }}
    
  5. 指定日期of()

    LocalDateTime dt2 = LocalDateTime.of(2019, 11, 30, 15, 16, 17);
    LocalDateTime dt3 = LocalDateTime.of(d2, t2);
    
  6. 按照默认格式(ISO 8601)解析parse()

    • ISO 8601规定的日期和时间分隔符是T
    • 日期:yyyy-MM-dd
    • 时间:HH:mm:ss
    • 带毫秒的时间:HH:mm:ss.SSS
    • 日期和时间:yyyy-MM-dd’T’HH:mm:ss
    • 带毫秒的日期和时间:yyyy-MM-dd’T’HH:mm:ss.SSS
    LocalDateTime dt = LocalDateTime.parse("2019-11-19T15:16:17");
    LocalDate d = LocalDate.parse("2019-11-19");
    LocalTime t = LocalTime.parse("15:16:17");
    
  7. DateTimeFormatter:自定义格式,用于输入或者输出均可。

  8. LocalDateTime日期增减

    • **注意:**月份加减会自动调整日期,例如从2019-10-31减去1个月得到的结果是2019-09-30,因为9月没有31日。

    • 对日期和时间进行调整则使用withXxx()方法,

      例如:withHour(15)会把10:11:12变为15:11:12

      • 调整年:withYear()
      • 调整月:withMonth()
      • 调整日:withDayOfMonth()
      • 调整时:withHour()
      • 调整分:withMinute()
      • 调整秒:withSecond()
      • with():更复杂的运算。
    LocalDateTime dt = LocalDateTime.of(2019, 10, 26, 20, 30, 59);// 加5天减3小时:
    LocalDateTime dt2 = dt.plusDays(5).minusHours(3);
    System.out.println(dt2); // 2019-10-31T17:30:59// 减1月:
    LocalDateTime dt3 = dt2.minusMonths(1);
    System.out.println(dt3); // 2019-09-30T17:30:59// with
    LocalDateTime dt2 = dt.withDayOfMonth(31);// 本月最后1天:
    LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
    // 本月第1个周一(对于计算某个月第1个周日这样的问题,新的API可以轻松完成。)
    LocalDate firstWeekday = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
    
  9. 要判断两个LocalDateTime的先后,可以使用isBefore()isAfter()方法,对于LocalDate和LocalTime类似:

    Boolean b=LocalDate.now().isBefore(LocalDate.of(2019, 11, 19));
    
  10. Duration和Period

  • Duration表示两个时刻之间的时间间隔。
  • Period表示两个日期之间的天数。

​ 注意到两个LocalDateTime之间的差值使用Duration表示,类似PT1235H10M30S,表示1235小时10分钟30秒。而两个LocalDate之间的差值用Period表示,类似P1M21D,表示1个月21天。

  1. DurationPeriod的表示方法也符合ISO 8601的格式,它以P…T…的形式表示

    • P…T之间表示日期间隔。
    • T后面表示时间间隔。
  2. 利用ofXxx()或者parse()方法也可以直接创建Duration

    (用作时间单位嘛,这我之前接触过!)

    Duration d1 = Duration.ofHours(10); // 10 hours
    Duration d2 = Duration.parse("P1DT2H3M"); //1day,2hours,3 minutes
    

2、ZonedDateTime

  1. ZonedDateTime:

    • 可以简单地把ZonedDateTime理解成LocalDateTime加**ZoneId**。
    • **ZoneId**是java.time引入的新的时区类,注意和旧的java.util.TimeZone区别。
    // 默认时区
    ZonedDateTime zbj = ZonedDateTime.now(); // 用指定时区获取当前时间,用到了 ZoneId。
    ZonedDateTime z = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));// 另一种方式是通过给一个LocalDateTime附加一个ZoneId
    LocalDateTime ldt = LocalDateTime.of(2019, 9, 15, 15, 16, 17);
    ZonedDateTime zbj = ldt.atZone(ZoneId.of("Asia/Shanghai"));
    
    • 时区转换withZoneSameInstant()

      (直接翻译:与该地区相同时刻…)

    // 以中国时区获取当前时间:
    ZonedDateTime zbj = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
    // 转换为东京时间:
    ZonedDateTime z = zbj.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));// 转换为本地时间(十分简单)
    z.toLocalDateTime();
    
  2. 要特别注意:

    ​ 时区转换的时候,由于夏令时的存在,不同的日期转换的结果很可能是不同的。涉及到时区时,千万不要自己计算时差,否则难以正确处理夏令时。

3、DateTimeFormatter

  1. 旧SimpleDateFormat新DateTimeFormatter对比:

    • 使用的Date对象时,我们用SimpleDateFormat进行格式化显示;使用LocalDateTimeZonedDateTime时,我们要进行格式化显示,就要使用DateTimeFormatter。
    • SimpleDateFormat线程不安全,使用时只能在方法内部创建新的局部变量;DateTimeFormatter不但是不变对象,而且线程安全,可以只创建一个实例,到处引用。
    • DateTimeFormatter格式化字符串的使用方式与SimpleDateFormat完全一致。
  2. 简单使用

    (注意使用方法,是谁包括了谁!)

【Java】Date日期类诠释相关推荐

  1. Java Date日期类中的getMonth()与getYear()提示过时警告

    Date日期类中的getMonth()与getYear()提示过时警告,这里的警告是方法过时,不建议使用. 解决方法,使用Calendar类,但是这里的获取月份是,会比数据中的月份少1,这里需要进行加 ...

  2. Java Date日期的比较

    Java Date日期的比较 为何要写这篇博客 实践方法 总结 为何要写这篇博客 Date类日期比较可以应用在很多方面上,例如集合时间的筛选,或者数据库数据的筛选.因为多个方法可以应用在不同方法之上, ...

  3. Java使用日期类实现打印输出各个年份的日历表

    Java使用日期类实现打印输出各个年份的日历表 实现样式: import java.time.LocalDate; import java.util.Scanner;/*** @Author: Say ...

  4. Java YearMonth日期类应用

    Java YearMonth日期类应用 在项目中会遇到仅需要存取年月,由于数据库一般不支持不完整日期格式,因此日期之间转换比较麻烦.本文通过介绍YearMonth类实现年月日期存取过程. 1. 概述 ...

  5. 常用类 (五) ----- Date日期类和Calender日历类

    相关文章: <常用类 (一) ----- Arrays数组工具类> <常用类 (二) ----- Math类> <常用类 (三) ----- BigDecimal和Big ...

  6. java date 日期部分_Java处理Date时间格式的各种场景工具类(二)

    public class DateUtil { public enum DateType { YEAR, MONTH, DAY, HH, MI, SS, YYYY_MM_DD, YYYYMMDD } ...

  7. Java Date 日期 时间 相关方法

    DateTools.java import java.text.SimpleDateFormat; import java.util.Date; /*** 日期操作类*/ public class D ...

  8. java date 操作类_JAVA时间操作类常用方法汇总

    1.JAVA中日期的获取.设置和格式化 (1)JAVA提供了3个日期类:Date.Calendar和DateFormat. Date()方法主要用于创建日期对象并获取日期: Calendar()方法主 ...

  9. java当中日期类的相关操作(学习笔记)

    一:引言 Calendar类是日历类,提供操作日历字段的方法,其中有常用操作 get 和 set 方法还有 add方法 详细用法请看码 二:上码 package cn.wyj.one;import j ...

  10. java Date 日期格式化

    今天来整理一下java中的日期类 1 时间原点的概念 八种基本数据类型包括字符串最终都可以以数字的方式表现出来(数据就是二进制,而二进制是可以转换成10进制的) 日期类型类似,2022年1,1,也可以 ...

最新文章

  1. Ubuntu 系统输入法设置
  2. 【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序
  3. vs oracle带参数更新,Oracle vs PostgreSQL Develop(23) - PL(pg)sql(参数声明)
  4. TCP/IP协议中常用端口表
  5. 近世代数--置换群--置换permutation分解成什么?置换的级如何计算?
  6. jsbridge实现及原理_如何实现一个优雅的jsBridge
  7. SVN - 简单使用手册
  8. 通过调试获得SAP Fiori gateway系统的系统ID
  9. CF700E-Cool Slogans【SAM,线段树合并,dp】
  10. java学习(53):接口的定义和创建
  11. 运算符 优先级 结合性
  12. 查看数据库开了inodb_Mysql中查看表的类型InnoDB
  13. 华为鸿蒙os2.0更新,鸿蒙OS2.0更新了吗?更新方法、更新包大小、使用体验等都来了...
  14. azkaban 入门简介
  15. jUI项目最初的名字为DWZ,这个名字是怎么来的?后来为什么又改为jUI?
  16. 复现 ASPCMS企业建站系统Cookies欺骗漏洞
  17. android ios mp4格式转换,ios格式转换器|iphone视频格式转换器免费版 7.1 - 系统天堂...
  18. 城市内涝一维二维耦合技术及在城市排水防涝领域中的实践应用
  19. 穷人实现阶级跨越有多难
  20. 精彩回顾 | 一文盘点2021年中小企业数字化转型最新趋势

热门文章

  1. error: no viable conversion from 'MyCalendar *' to 'MyCalendar'
  2. Manjaro学习笔记
  3. NiFi Processors概述
  4. 扫雷算法实现(简易版,只能在CMD指令中玩)
  5. 《炬丰科技-半导体工艺》石英深反应离子刻蚀特性研究
  6. python数据汇总_Python,将数据框中的每日数据汇总到每月和每季度
  7. 阿里图标库彩色图标使用
  8. 领先招聘和支付平台Deel筹资1.56亿美元,成为独角兽企业
  9. uniapp nvue运用map组件实现地图标注以及检索周边地址
  10. 最全Ansible学习总结