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

news2025/3/17 17:30:20

本小节我们将学习 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.coloradmin.cn/o/1789756.html

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

相关文章

ru域名如何申请ssl证书

SSL证书是一种数字证书,通过它可以在客户端和服务器之间建立加密通道,保证数据在传输过程中的安全性。对于.ru域名来说,申请SSL证书可以有效提升网站的安全性,增强用户对网站的信任度,提高网站的排名和权重。今天就随S…

计算机网络 —— 数据链路层(VLAN)

计算机网络 —— 数据链路层(VLAN) 什么是VLAN为什么要有VLANVLAN如何实现IEEE 802.1Q 我们今天来看VLAN: 什么是VLAN VLAN(Virtual Local Area Network,虚拟局域网)是一种网络技术,它将一个物…

clickhouse学习笔记(一)入门与安装

目录 一 、入门 简介 核心特性包括 1.1 列式存储 1.2 原生压缩 1.3 向量化执行引擎 1.4 DBMS 功能 1.5 分布式处理 1.6 高吞吐写入能力 1.7 实时分析 1.8 SQL支持 1.9 高度可扩展 1.10 数据分区与线程级并行 1.11 应用场景 1.12 不适用场景 二、ClickHouse单机版…

LabVIEW中PID控制器系统的噪声与扰动抑制策略

在LabVIEW中处理PID控制器系统中的噪声和外部扰动,需要从信号处理、控制算法优化、硬件滤波和系统设计四个角度入手。采用滤波技术、调节PID参数、增加前馈控制和实施硬件滤波器等方法,可以有效减少噪声和扰动对系统性能的影响,提高控制系统的…

View->可拖拽滑动的ImageView + Fling惯性滑动效果 + 回弹效果

XML文件 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:o…

牛客热题:矩阵最长递增路径

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;矩阵最长递增路径题目链接方法一…

铸铁机械5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

铸铁机械5G智能工厂工业物联数字孪生平台&#xff0c;推进制造业数字化转型。工业物联数字孪生平台以5G技术为基础&#xff0c;通过工业物联网连接铸铁机械生产过程中的各个环节&#xff0c;运用数字孪生技术构建虚拟工厂&#xff0c;实现生产过程的实时监测、模拟与优化&#…

人工智能期末复习

&#x1f4cd;人工智能概论期末复习✔️ 知识表示与知识图谱⭐⭐ 知识的特性 相对正确性 不确定性 可表示性与可利用性 知识表示 将人类知识形式化或者模型化。 选择知识表示方法的原则 &#xff08;1&#xff09;充分表示领域知识。 &#xff08;2&#xff09;有利于对…

在线测宽仪的发展历程!

在线测宽仪的发展历程可以归纳为以下几个阶段&#xff1a; 光机扫描式测宽仪阶段&#xff1a; 时间&#xff1a;70年代以前 技术特点&#xff1a;通过机械旋转狭缝机构的扫描&#xff0c;由光电倍增管输出信号&#xff0c;经模拟信号处理得到测量结果。 国内应用&#xff1a;…

全光谱led灯的危害有哪些?曝光低质量全光谱led灯产生的四大风险

眼睛是人类获取信息最重要的感官器官之一&#xff0c;而近视则会导致视力模糊&#xff0c;进而影响学习效果和生活品质。因此&#xff0c;如何保护眼睛&#xff0c;尤其是在学习和使用电子设备时&#xff0c;成为了一个迫切需要解决的问题。然而在护眼领域上&#xff0c;护眼台…

Linux C语言: 数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址&#xff08;类似门牌号&#xff09; • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

边缘计算网关助力自动洗车机实现远程状态监测与即时报警

随着城市化进程的加快和人们生活水平的提高&#xff0c;自动洗车机作为一种高效、便捷的洗车设备&#xff0c;在市场上的需求日益增长。然而&#xff0c;自动洗车机作为一种高价值的自动化设备&#xff0c;其运行状态和安全性直接关系到洗车质量和顾客体验&#xff0c;因此对自…

Mitmproxy作为瑞士军刀可拦截、检查、修改和重放网络流量可用于渗透测试。

Mitmproxy是一个开源的中间人代理工具&#xff0c;用于拦截、修改和查看HTTP和HTTPS流量。它可以用于调试、测试和分析网络应用程序和移动应用程序的通信。 Mitmproxy可以在本地计算机上作为一个代理服务器运行&#xff0c;将所有流量导向到它&#xff0c;然后可以查看和修改这…

UIKit之图片轮播器Demo

需求 实现图片轮播器&#xff0c;搭配页面指示器、可以自动轮播。 注意计时器优先级问题 分析 需要UIScrollView组件、指示器UIPageControl。此外自定义类需要实现代理自动滚动需要监控当前屏幕的offsetx。防止拖拽自动滚动时一下子翻滚太多的BUG&#xff1a;拖拽时&#x…

德人合科技——@天锐绿盾 | -文档透明加密系统

天锐绿盾文档透明加密系统是一种先进的数据安全解决方案&#xff0c;旨在保护企业和组织的敏感信息&#xff0c;防止未经授权的访问和泄漏。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是该系统的一些关键特点和功…

规则引擎-Easy rule

规则引擎-Easy rule 最近有几个项目中都出现了根据XX条件执行XX方法的业务&#xff0c;在动手之前脑中总会下意识的发现如果按照常规的去写代码&#xff0c;无论使用何种设计模式&#xff0c;都会出现不同程度上的代码冗余或大量if-else判断。 甚至说判断XX条件的代码和执行X…

26、matlab多项式曲线拟合:polyfit ()函数

1、polyfit 多项式曲线拟合 语法 语法&#xff1a;p polyfit(x,y,n) 返回次数为 n 的多项式 p(x) 的系数&#xff0c;该阶数是 y 中数据的最佳拟合&#xff08;基于最小二乘指标&#xff09;。 语法&#xff1a;[p,S] polyfit(x,y,n) 还返回一个结构体 S 语法&#xff1a;[…

学会这14大招,30天涨粉两三千没问题!沈阳新媒体运营培训

很多小白在刚转入公司做新媒体时&#xff0c;基本都是从帮助公司运营账号开始的。但不同于个人号&#xff0c;一个企业本身是没有ip属性的&#xff0c;它的风格、调性等&#xff0c;都需要通过你的运营&#xff0c;让它变成一个活灵活现的、赋予独立个性人设的账号。 目前&…

IC设计企业致力于解决的HPC数据防泄漏,到底该怎么做?

对于半导体IC设计企业来说&#xff0c;芯片设计、验证、仿真使用HPC环境现在已逐渐成为趋势&#xff0c;主要原因在于原来的工作流程存在较多的缺陷&#xff1a; 性能瓶颈&#xff1a;仿真、设计、验证、生产过程中&#xff0c;前端仿真需要小文件高并发低时延的读写和巨量元数…

Ubuntu server 24.04 (Linux) 搭建DNS服务器 通过Nginx实现UDP/TCP负载均衡 轻量级dnsmasq服务器

一 系统运行环境 testtest:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04 LTS" NAME"Ubuntu" VERSION_ID"24.04" VERSION"24.04 LTS (Noble Numbat)" VERSION_CODENAMEnoble IDubuntu ID_LIKEdebian HOME_URL"https://www.…