38. 【Java教程】日期和时间处理

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

1. 什么是日期和时间

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

  • 2024-6-5:2020 年 6 月 5 日;
  • 1998-6-14:1998 年 6 月 14 日。

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

  • 2024-6-5 10:30:23:2024 年 6 月 5 日 10 时 30 分 23 秒;
  • 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 + "天");}
}

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

今天是这一周的第3天
今天是这一月的第5天
今天是这一月的第1周
今天是这一年的第157天

通过调用 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);}}

运行结果:

2024-06-05
11:17:48.618294
2020-06-05T14:11:48.618421

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

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

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

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

6. 小结

通过本小节的学习,我们知道了日期、时间和时区的基本概念,在 Java 8 之前,通过 Date 类、Calendar 类以及 SimpleDateFormat 类来操作日期和时间,Java 8 以后,java.time 包下新增了一批新的日期时间 API,修复了旧 API 的一些缺点,简化了开发者操作日期和时间的难度。本小节内容比较简单,梳理了 Java 对于日期时间处理的相关 API,大家参照文档,加以练习即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3072. 将元素分配到两个数组中 II

题目 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount ,使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作,将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操…

WebGL画粗线

目录 前言 基本思路 求左右端点 实现 组织数据 顶点着色器计算端点坐标 效果 前言 WebGL绘制模式有点、线、面三种;通过点的绘制可以实现粒子系统等,通过线可以绘制一些连线关系;面就强大了,通过面,我们可以…

视频监控汇聚平台LntonCVS国标GB28181协议实现语音对讲功能

在当今这个智能技术飞速发展的时代,人工智能已经成为了电子产品领域的一股不可忽视的热门趋势。随着科技的不断进步,越来越多的电子产品开始融入人工智能技术,从而为其开拓了全新的发展路径。在这个大背景下,安防摄像头无插件直播…

基于springboot实现智慧校园之家长子系统项目【项目源码】计算机毕业设计

基于springboot实现智慧校园之家长子系统演示 SpringBoot框架介绍 本课题程序开发使用到的框架技术,英文名称缩写是SpringBoot,在JavaWeb开发中使用的流行框架有SSH、SpringBoot、SpringMVC等,作为一个课题程序采用SSH框架也可以&#xff0c…

【学习】测试用例设计与执行的黄金法则

在软件测试领域,测试用例的设计与执行是确保产品质量的关键环节。一个优秀的测试用例能够揭示软件中的缺陷,而高效的执行则能保障测试覆盖的全面性。如同璀璨的星辰指引航船前行,以下黄金法则将引领测试用例设计与执行的过程,确保…

Go 群发邮件Redis 实现邮件群发

一、安装 go get github.com/go-redis/redis/v8 go get gopkg.in/gomail.v2 二、使用"gopkg.in/gomail.v2"群发 package mainimport (gomail "gopkg.in/gomail.v2" )func main() {// 邮件内容m : gomail.NewMessage()m.SetHeader("From", &qu…

【杂谈】AIGC之Stable Diffusion:AI绘画的魔法

Stable Diffusion:AI绘画的魔法 引言 在AI的世界里,Stable Diffusion就像一位魔法师,它能够将我们脑海中的幻想,用画笔一一描绘出来。今天,就让我们一探这位魔法师的奥秘,看看它是如何从无到有&#xff0…

安装MongoDB单副本说明

参考:https://blog.csdn.net/weixin_43464076/article/details/126509254 https://driverzhang.github.io/post/mongo%E5%BC%80%E5%90%AF%E4%BA%8B%E5%8A%A1%E4%B9%8B%E5%89%AF%E6%9C%AC%E9%9B%86%E9%87%87%E5%9D%91/ https://dev.to/alexalvess/getting-started-wi…

实习面试题(答案自敲)、

1、为什么要重写equals方法,为什么重写了equals方法后,就必须重写hashcode方法,为什么要有hashcode方法,你能介绍一下hashcode方法吗? equals方法默认是比较内存地址;为了实现内容比较,我们需要…

mysql表级锁(表锁/元数据锁/意向锁)

文章目录 表级锁的分类1、表锁(分类)1.表共享读锁(read lock)2.表独占写锁(write lock)3.语法: 2、元数据锁(meta data lock )3、意向锁1.意向共享锁(IS):由语…

【wiki知识库】05.分类管理实现--前端Vue模块

📝个人主页:哈__ 期待您的关注 目录 一、🔥今日目标 二、🌏前端部分的改造 2.1 新增一个tool.ts 2.2 新增admin-categoty.vue 2.3 添加新的路由规则 2.4 添加the-welcome.vue 2.5 修改HomeView.vue 三、❗注意 一、&…

车来了冲刺上市:业绩波动明显,依赖广告业务,滴滴、阿里入股

近日,MetaLight Inc.(下称“元光科技”或“车来了”)向港交所递交招股说明书,中金公司为其独家保荐人。 据招股书介绍,元光科技专注于利用时序数据(按时间顺序排列的数据点)来发现及预测分析对…

docker 存储 网络 命令

文章目录 1 docker存储1.1 目录挂载2.1卷映射2.1.1卷映射和目录挂载的区别2.1.2卷映射的使用 2 docker网络2.1查看docker的默认网络2.2查看容器的IP2.3容器互通2.4自定义网络2.4.1 创建自定义网络2.4.2创建容器的时候加入到自定义的网络2.4.3使用域名进行容器之间的访问2.4.4re…

盛凌电子IPO终止:实控人蒋志坚曾和前妻黄新打官司,儿子已离职

保荐人撤销,致使公司IPO终止。 近日,深圳证券交易所披露的信息显示,深圳盛凌电子股份有限公司(下称“盛凌电子”)的保荐人申万宏源证券撤回上市申请文件。因此,深圳证券交易所决定终止对该公司首次公开发行…

Qt报错:libvlc开发的程序,出现Direct3D output全屏窗口

问题描述: 在qt中开发重播模块时,第一次在窗口正常播放,点击重播按钮后会弹出新的Direct3D output窗口播放视频 分析: 因为libvlc_media_player_set_hwnd 这个函数 设置了不存在的窗口句柄,导致vlc视频播放窗口没有嵌…

kubesz(一键安装k8s)

引言 Kubernetes(K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。kubeasz 是一个用于快速搭建 Kubernetes 高可用集群的项目,它基于 Ansible,通过提供一套简单、易用的配置,使得…

用易查分制作活动抽奖系统,支持随机分配中奖结果!

学校或企业在开展抽奖活动时,如何确保公平公正,随机挑选中奖人员呢? 易查分的预置数据分配功能就可以实现,并且支持提交信息后随机分配中奖结果,不受任何人为因素的影响。下面就来教大家如何制作吧。 📌使用…

ArcGIS for Vue3

二维&#xff1a; 1、创建vue项目 npm create vitelatest 2、安装ArcGIS JS API依赖包 npm install arcgis/core 3、引入ArcGIS API for JavaScript模块 <script setup> import "arcgis/core/assets/esri/themes/light/main.css"; import Map from arcgis…

HTML5+CSS3+JS小实例:网格图库

实例:网格图库 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0&…

EXCEL从图片链接获取图片

step1: 选中图片地址列 step2:开发工具→Visual Basic 文件→导入 导入我制作的脚本&#xff08;代码见文章末尾&#xff09; 点击excel的小图标回到表格界面。 点击【宏】 选中刚才导入的脚本&#xff0c;点执行&#xff0c;等待完成。 代码本体&#xff1a; Sub InsertPict…