Java 日期和时间

日期和时间在我们的实际开发中非常常用,例如用户的注册、数据的增删改、对敏感信息的操作等等都需要记录下日期和时间。通过本小节的学习,你将了解到什么是日期什么是时间什么是时区,Java 中Date类的 API 介绍,Calendar 日历类的使用,LocalDateTime类的相关 API 介绍等内容。

1. 什么是日期和时间

日期指的是某一天,例如:

  • 2020-10-24:2020 年 10 月 24 日;
  • 1998-6-14:1998 年 6 月 14日。

时间就是指某一个时刻,它分为两种,一种是带日期的时间,另外一种是不带日期的时间,例如:

  1. 2020-10-24 08:30:23:2020 年 10 月 24 日 8 时 30 分 23 秒;
  2. 11:22:33:11 时 22 分 33秒。

2. 什么是时区

我们知道,地球上的不同地区是有时差的,因此想要准确定位一个时刻,还需要加上时区。
时区有以下 3 种表示方式:

  1. GMT或者UTC加时区偏移表示:例如:GMT+08:00或者UTC+08:00表示东八区;
  2. 缩写表示:例如:CST 表示China Standard Time(中国标准时间),但是此缩写也可表示Central Standard Time USA(美国中部时间),容易混淆不推荐使用;
  3. 洲/城市:例如:Asia/Shanghai表示上海所在地的时区。注意城市名称不是任意的城市,而是由国际标准组织规定的城市。

3. Date 类的使用

java.util.Date 类日期表示特定的时间瞬间,精度为毫秒。我们下面来看一下这个类的构造方法和常用方法。

3.1 构造方法

  • Date():创建一个对应当前时间的日期对象;
  • Date(long date):创建指定毫秒数的日期对象。
    由于其他 4 个构造方法已经过期,这里我们不进行介绍。

3.2 常用方法

  • String toString():将此日期对象转换为以下形式的字符串:星期 月 日 时:分:秒 时区 年;
  • long getTime():返回此日期对象表示的自1970年1月1日00:00:00 GMT以来的毫秒数;
  • void setTime():将此日期对象设置为表示1970年1月1日00:00:00 GMT之后的时间点(毫秒)。
    **Tips:**除了java.util包下的Date类,在java.sql包下也有一个Date类。它是对应数据库字段的日期类型的类,与数据库交互的时候才会用到,由于目前我们不涉及数据库相关知识,此处做一个了解即可。我们更常用的还是java.util包下的Date类。

3.3 实例

创建日期对象,并打印toString()方法的结果:

import java.util.Date;/*** @author colorful@TaleLin*/
public class DateDemo1 {public static void main(String[] args) {// 实例化一个date对象Date date = new Date();// 调用 toString() 方法String s = date.toString();System.out.println(s);}}

运行结果:

Wed Jun 10 10:21:10 CST 2020

我执行代码的时间是 2020年06月10日10:22:10 星期三,因此得到了如上的运行结果。

调用 getTime()方法获取当前日期对象自1970年1月1日00:00:00 GMT以来的毫秒数:

import java.util.Date;/*** @author colorful@TaleLin*/
public class DateDemo2 {public static void main(String[] args) {// 实例化一个date对象Date date = new Date();// 调用 getTime() 方法long time = date.getTime();System.out.println(time);}}

运行结果:

1591755946922

4. Calendar 类的使用

Calendar类是一个抽象类,它提供了一些方法,用于在特定的时间瞬间与一组日历字段(如年、月、月、日、小时等)之间进行转换,以及用于处理日历字段(如获取下一周的日期)。

4.1 实例化

由于Calendar类是一个抽象类,不能直接实例化,想要获取其实例对象通常有两种方法:

  1. 使用Calendar.getInstance()方法(更常用);
  2. 调用它的子类的GregorianCalendar的构造方法。

实例如下:

Calendar calendar = Calendar.getInstance();

4.3 常用方法

  • static Calendar getInstance():使用默认时区和区域设置获取日历;
  • int get(int field):返回给定日历字段的值;
  • void set(int field, int value):将给定的日历字段设置为给定值。(此外,set()还有很多重载方法)

get(int field)set(int field, int value)方法的field参数是int类型,我们可以使用Calendar类下的一些静态字段来表示,如下是官方文档关于Calendar类的部分静态字段的截图:

更多常用方法和静态字段请查阅官方文档。

4.3 实例

4.3.1 get() 方法实例

import java.util.Calendar;/*** @author colorful@TaleLin*/
public class CalendarDemo1 {public static void main(String[] args) {Calendar calendar = Calendar.getInstance();// 获取今天是这一周的第几天int i = calendar.get(Calendar.DAY_OF_WEEK);// 获取今天是这一月的第几天int i1 = calendar.get(Calendar.DAY_OF_MONTH);// 获取今天是这一月的第几周int i2 = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH);// 获取今天是这一年的第几天int i3 = calendar.get(Calendar.DAY_OF_YEAR);System.out.println("今天是这一周的第" + i + "天");System.out.println("今天是这一月的第" + i1 + "天");System.out.println("今天是这一月的第" + i2 + "周");System.out.println("今天是这一年的第" + i3 + "天");}
}

运行此段代码的时间是 2020 年 06 月 10 日,运行结果如下:

今天是这一周的第4天
今天是这一月的第10天
今天是这一月的第2周
今天是这一年的第162天

通过调用get()方法,我们很方便地获取到了当前时间在日历上是第几天。要特别注意的是,获取月份,返回的值是从 0 开始的(0 ~ 11),依次表示 1 月到 12 月;获取一周的第n天,这里的返回值为1~71 表示周日,2 表示周一,以此类推。

4.3.2 set() 方法实例

import java.util.Calendar;/*** @author colorful@TaleLin*/
public class CalendarDemo2 {public static void main(String[] args) {Calendar calendar = Calendar.getInstance();// 设置2022年:calendar.set(Calendar.YEAR, 2022);// 设置9月: (8表示9月)calendar.set(Calendar.MONTH, 8);// 设置9日:calendar.set(Calendar.DATE, 9);// 设置时间:calendar.set(Calendar.HOUR_OF_DAY, 0);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);System.out.println(calendar.getTime().toString());}
}

运行结果:

Fri Sep 09 00:00:00 CST 2022

上面代码分别设置了日历的年、月、日、时、分、秒,Calendar.getTime()可以将一个Calendar对象转换成Date对象,最后再打印这个对象。

5. Java8 后新的日期和时间 API

5.1 为什么要提供新的 API

在 Java8 以后,提供了新的日期和时间 API,旧 API 的如下缺点得到了解决:

  • 可变性:旧的 API 日期和时间是可变的,日期和时间这样的类应该是不可变的;
  • 偏移性:Date中的年份是从 1990 年开始,月份是从 0 开始,星期天是用 1 表示的,不了解 API 的开发者很容易用错;
  • 格式化:SimpleDateFormat只能用于格式化Date类型,不能格式化Calendar类型。

5.2 新 API 概述

新的日期时间 API 吸取了Joda-Time的精华,提供了更优秀易用的 API,位于java.time包中,包含了LocalTime(本地日期)、LocalDate(本地时间)、LocalDateTime(本地日期时间)、ZonedDateTime(带时区的日期时间)和Duration(时间间隔)类。

java.util.Date类下面增加了toInstant()方法,用于把Date转换为新的类型。这些 API 大大简化了日期时间的运算。

对偏移性的不合理设计也有修正:月份使用 1~12表示 1 月 到 12 月,星期使用 1 ~ 7表示星期一到星期天。

另外,使用了新的DateTimeFormatter来取代旧的SimpleDateFormat

5.3 LocalDateTime 相关类的使用

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;/*** @author colorful@TaleLin*/
public class LocalDateTimeDemo1 {public static void main(String[] args) {// 获取当前日期LocalDate localDate = LocalDate.now();// 获取当前时间LocalTime localTime = LocalTime.now();// 获取当前日期和时间LocalDateTime localDateTime = LocalDateTime.now();// 打印System.out.println(localDate);System.out.println(localTime);System.out.println(localDateTime);}}

运行结果:

2020-06-10
14:17:48.618294
2020-06-10T14:17:48.618421

在实际开发中,LocalDateTime相较于LocalDateLocalTime更加常用。

本地日期和时间通过now()获取到的总是以当前默认时区返回的。

另外,可以使用of()方法来设置当前日期和时间:

// 2020-9-30
LocalDate date = LocalDate.of(2020, 9, 30);
// 14:15:10
LocalTime time = LocalTime.of(14, 15, 10);
// 将date和time组合成一个LocalDateTime
LocalDateTime dateTime1 = LocalDateTime.of(date, time);
// 设置 年、月、日、时、分、秒
LocalDateTime dateTime2 = LocalDateTime.of(2020, 10, 21, 14, 14);

6. 小结

通过本小节的学习,我们知道了日期、时间和时区的基本概念,在 Java 8 之前,通过Date类、Calendar类以及SimpleDateFormat类来操作日期和时间,Java 8 以后,java.time包下新增了一批新的日期时间 API,修复了旧 API 的一些缺点,简化了开发者操作日期和时间的难度。

Java 日期和时间相关推荐

  1. Java日期及时间库插件 -- Joda Time.

    转载自   Java日期及时间库插件 -- Joda Time. 来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用 ...

  2. 详解 Java 日期与时间

    文章目录 一.时区 二.夏令时 三.旧 API 3.1. Date 3.2. SimpleDateFormat 3.3. Calendar 四.新 API 4.1. LocalDateTime 4.2 ...

  3. java 日期calendar_java时间对象Date,Calendar和LocalDate/LocalDateTime

    一.简介 Date:java.util.Date包,包含日期,时间,毫秒数. Calendar:java.util.Calendar包,abstract修饰,Date的很多方法已经过时迁移到了Cale ...

  4. java日期和时间操作

    Java日期处理 参考 https://juejin.cn/post/6844903560375697422 https://mp.weixin.qq.com/s/q__JSyLt1iy4h3NwZ6 ...

  5. Java日期和时间JDK—API1.6.0(Date类、Calendar类)

    java.util,Date Java在java.util包中提供了Date类,这个类封装了当前的日期和时间: 所有已经实现的接口:Serializable         Cloneable    ...

  6. java 日期和时间格式化转换符操作

    学习java时知识太过的零碎,不系统,学习东西以快为主,导致根基不稳,现在决定把java基础重新学习一遍,把自认为比较好的java使用方式拿出来 1.自己在熟悉一遍 2.后续方便查找 3.没有了解的在 ...

  7. java 日期和时间_java 日期与时间操作

    我们先来了解一下基本的概念 日期 2020-11-21 2020-11-22 时间 15:36:43 2020-11-21 15:36:43 时区 北京时间 2020-11-21 15:36:43 东 ...

  8. Java日期与时间API(详解全部新与旧API,含代码例子)

    目录 前言必读 二.新与旧API 新的API: 旧的API: 初步使用大全(SimpleDateFormat) 三.代码例子 1.获取当前时间 2.字符串转化为时间 四.新的API 1.LocalDa ...

  9. Java日期和时间详解

    日期和时间 时间线 Java的Date和TimeAPI规范要求Java使用的时间尺度为: 每天86400秒 每天正午与官方时间精确匹配 在其他时间点上,以精确定义的方式与官方时间接近匹配 这赋予了Ja ...

最新文章

  1. 学习excel的使用技巧一空格替换为0
  2. 网站排名在首位后,为什么还要继续做SEO?
  3. 启明云端分享|ESP32-­C3­-MINI­-1和ESP32­-C3-­MINI-­1U的区别是什么?
  4. ORACLE ORA-02030: can only select from fixed tables/views
  5. UML轻松入门--类和对象
  6. magento邮件使用php,Magento订单成功无邮件发送
  7. 【数据结构】普通二叉树的实现
  8. scp 、ssh非22端口的服务器方法
  9. 楼宇计算机网络是如何工作的,【干货】建筑楼宇智能化如何应用 4C 技术
  10. 用函数刷新页面内容比刷新页面要好
  11. JAVA虚拟机垃圾回收算法原理
  12. Xcode之developer tools access
  13. 计算机一直在启动修复怎么关机,电脑开机总是要启动修复修复后重启还要修复怎么处理方法...
  14. python怎么解压rar文件_Python 解压缩文件详解
  15. 无线渗透(下)—企业级WPA破解
  16. 【OpenFOAM】——OpenFOAM入门算例学习
  17. 【路径规划】基于蚁群算法的多配送中心车辆路径优化方法matlab代码
  18. 求解1-1/2+1/3+...1/99-1/100的和
  19. dsf5.0没登录显示登录弹框
  20. 用edge调试安卓或者手机app的样式

热门文章

  1. Java实现简单的P2P聊天软件
  2. 实现自己的音乐搜索软件(二)
  3. 崇州鸡冠山(地图、攻略、图片、GPS、经纬度、海拔、OZI)
  4. 华为核心交换如何配置源地址转换_华为三层交换机配置步骤解释资料全
  5. _CommandPtr 添加参数 0xC0000005: Access violation writing location 0xcccccccc 错误
  6. Go 语言 strings 库常用方法
  7. CVPR 2020之117篇GAN论文分类汇总清单
  8. MySQL之InnoDB表存储格式
  9. 计算机原理中的三种映射方式
  10. code规范 --- 驼峰命名法