Java 日期和时间
Java 日期和时间
日期和时间在我们的实际开发中非常常用,例如用户的注册、数据的增删改、对敏感信息的操作等等都需要记录下日期和时间。通过本小节的学习,你将了解到什么是日期、什么是时间、什么是时区,Java 中Date
类的 API 介绍,Calendar
日历类的使用,LocalDateTime
类的相关 API 介绍等内容。
1. 什么是日期和时间
日期指的是某一天,例如:
- 2020-10-24:2020 年 10 月 24 日;
- 1998-6-14:1998 年 6 月 14日。
时间就是指某一个时刻,它分为两种,一种是带日期的时间,另外一种是不带日期的时间,例如:
- 2020-10-24 08:30:23:2020 年 10 月 24 日 8 时 30 分 23 秒;
- 11:22:33:11 时 22 分 33秒。
2. 什么是时区
我们知道,地球上的不同地区是有时差的,因此想要准确定位一个时刻,还需要加上时区。
时区有以下 3 种表示方式:
GMT
或者UTC
加时区偏移表示:例如:GMT+08:00
或者UTC+08:00
表示东八区;- 缩写表示:例如:
CST
表示China Standard Time
(中国标准时间),但是此缩写也可表示Central Standard Time USA
(美国中部时间),容易混淆不推荐使用; - 洲/城市:例如:
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
类是一个抽象类,不能直接实例化,想要获取其实例对象通常有两种方法:
- 使用
Calendar.getInstance()
方法(更常用); - 调用它的子类的
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~7
,1 表示周日,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
相较于LocalDate
和LocalTime
更加常用。
本地日期和时间通过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 日期和时间相关推荐
- Java日期及时间库插件 -- Joda Time.
转载自 Java日期及时间库插件 -- Joda Time. 来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用 ...
- 详解 Java 日期与时间
文章目录 一.时区 二.夏令时 三.旧 API 3.1. Date 3.2. SimpleDateFormat 3.3. Calendar 四.新 API 4.1. LocalDateTime 4.2 ...
- java 日期calendar_java时间对象Date,Calendar和LocalDate/LocalDateTime
一.简介 Date:java.util.Date包,包含日期,时间,毫秒数. Calendar:java.util.Calendar包,abstract修饰,Date的很多方法已经过时迁移到了Cale ...
- java日期和时间操作
Java日期处理 参考 https://juejin.cn/post/6844903560375697422 https://mp.weixin.qq.com/s/q__JSyLt1iy4h3NwZ6 ...
- Java日期和时间JDK—API1.6.0(Date类、Calendar类)
java.util,Date Java在java.util包中提供了Date类,这个类封装了当前的日期和时间: 所有已经实现的接口:Serializable Cloneable ...
- java 日期和时间格式化转换符操作
学习java时知识太过的零碎,不系统,学习东西以快为主,导致根基不稳,现在决定把java基础重新学习一遍,把自认为比较好的java使用方式拿出来 1.自己在熟悉一遍 2.后续方便查找 3.没有了解的在 ...
- java 日期和时间_java 日期与时间操作
我们先来了解一下基本的概念 日期 2020-11-21 2020-11-22 时间 15:36:43 2020-11-21 15:36:43 时区 北京时间 2020-11-21 15:36:43 东 ...
- Java日期与时间API(详解全部新与旧API,含代码例子)
目录 前言必读 二.新与旧API 新的API: 旧的API: 初步使用大全(SimpleDateFormat) 三.代码例子 1.获取当前时间 2.字符串转化为时间 四.新的API 1.LocalDa ...
- Java日期和时间详解
日期和时间 时间线 Java的Date和TimeAPI规范要求Java使用的时间尺度为: 每天86400秒 每天正午与官方时间精确匹配 在其他时间点上,以精确定义的方式与官方时间接近匹配 这赋予了Ja ...
最新文章
- 学习excel的使用技巧一空格替换为0
- 网站排名在首位后,为什么还要继续做SEO?
- 启明云端分享|ESP32-C3-MINI-1和ESP32-C3-MINI-1U的区别是什么?
- ORACLE ORA-02030: can only select from fixed tables/views
- UML轻松入门--类和对象
- magento邮件使用php,Magento订单成功无邮件发送
- 【数据结构】普通二叉树的实现
- scp 、ssh非22端口的服务器方法
- 楼宇计算机网络是如何工作的,【干货】建筑楼宇智能化如何应用 4C 技术
- 用函数刷新页面内容比刷新页面要好
- JAVA虚拟机垃圾回收算法原理
- Xcode之developer tools access
- 计算机一直在启动修复怎么关机,电脑开机总是要启动修复修复后重启还要修复怎么处理方法...
- python怎么解压rar文件_Python 解压缩文件详解
- 无线渗透(下)—企业级WPA破解
- 【OpenFOAM】——OpenFOAM入门算例学习
- 【路径规划】基于蚁群算法的多配送中心车辆路径优化方法matlab代码
- 求解1-1/2+1/3+...1/99-1/100的和
- dsf5.0没登录显示登录弹框
- 用edge调试安卓或者手机app的样式