当前位置: 首页 > news >正文

Java 日期时间

Java 日期时间是 Java 标准库中一个非常重要的部分,它提供了丰富的 API 来处理日期、时间以及日期时间。在 Java 应用程序中,我们经常需要处理日期时间相关的操作,例如计算两个日期之间的差、将日期时间转换为不同的时区等。在本篇文章中,我们将介绍 Java 日期时间的基本概念、常用类以及实际应用场景。

基本概念

在 Java 中,我们可以使用 java.util.Datejava.util.Calendar 类来表示日期时间。在 JDK 8 之后,Java 8 引入了新的日期时间 API,即 java.time 包,该包提供了一组全新的类,包括 LocalDate、LocalTime、LocalDateTime、Instant、Duration 和 Period 等,用于替换旧的 Date 和 Calendar 类。这些新的日期时间类提供了更加简单、直观和类型安全的 API,以便更轻松地处理日期时间。

常用类

java.util.Date

java.util.Date 类是 Java 中表示时间点的类,它表示自 Unix 元年(1970 年 1 月 1 日 00:00:00 GMT)以来的毫秒数。Date 类的构造函数可以接受一个毫秒数作为参数,也可以使用默认构造函数创建一个当前时间的 Date 实例。以下是使用 Date 类的示例代码:

import java.util.Date;public class DateDemo {public static void main(String[] args) {// 创建当前时间的 Date 实例Date now = new Date();System.out.println("当前时间:" + now);// 创建指定毫秒数的 Date 实例Date date = new Date(1614635671000L);System.out.println("指定时间:" + date);}
}

需要注意的是,由于 Date 类的设计存在一些问题,因此在 Java 8 中已经被新的日期时间 API 所替代,因此不建议在实际项目中使用 Date 类。

格式化日期时间

日期时间格式化是将日期时间对象转换为指定格式的字符串的过程。Java 中有一个 DateFormat 类可以用来格式化日期时间。该类是一个抽象类,它提供了一些方法来格式化日期时间,比如将日期时间对象转换为字符串、将字符串转换为日期时间对象等。但是,由于 DateFormat 是一个抽象类,因此我们无法直接使用它来进行日期时间格式化。Java 提供了两个具体的子类 SimpleDateFormat 和 DateFormatSymbols 来完成日期时间格式化。

SimpleDateFormat 类提供了格式化日期时间的方法,它通过构造函数或 applyPattern() 方法设置格式化字符串,然后使用 format() 方法将日期时间对象转换为指定格式的字符串。

以下是使用 SimpleDateFormat 格式化日期时间的示例:

import java.text.SimpleDateFormat;
import java.util.Date;public class DateTimeDemo {public static void main(String[] args) {Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String dateString = sdf.format(date);System.out.println(dateString);}
}

在 SimpleDateFormat 中,日期时间格式化字符串中可以使用的字符如下表所示:

字符描述
yyyy年份
MM月份
dd
HH小时 (24小时制)
hh小时 (12小时制)
mm分钟
ss
SSS毫秒
E星期几
D当年的第几天
F当月的第几个星期几
w当年的第几个星期
W当月的第几个星期
a上午/下午
z时区

在格式化字符串中可以使用除上表以外的其他字符,这些字符将被直接输出到字符串中。

DateFormatSymbols 类提供了一些方法来获取格式化日期时间字符串中所用的符号(比如星期几的名称、上午/下午的名称等)。我们可以使用 DateFormatSymbols 类来更改默认的日期时间格式符号,或获取某个本地化环境下的日期时间格式符号。

以下是使用 DateFormatSymbols 类获取日期时间格式符号的示例:

import java.text.DateFormatSymbols;
import java.util.Locale;public class DateTimeDemo {public static void main(String[] args) {DateFormatSymbols dfs = new DateFormatSymbols(Locale.CHINA);String[] months = dfs.getMonths();String[] weekdays = dfs.getWeekdays();String[] ampm = dfs.getAmPmStrings();for (String month : months) {System.out.println(month);}for (String weekday : weekdays) {System.out.println(weekday);}for (String ap : ampm) {System.out.println(ap);}}
}

运行以上代码,输出的结果类似于:

一月
二月
三月
四月
五月
六月

ZoneId 类

ZoneId 类代表时区标识符,可以用于处理时区相关的操作。在 Java 8 中,它是新引入的类,用于替代旧的 TimeZone 类。

以下是一些使用 ZoneId 的示例代码:

// 获取当前时区
ZoneId zoneId = ZoneId.systemDefault();
System.out.println(zoneId); // 输出 "Asia/Shanghai"// 获取指定时区的当前时间
ZoneId losAngelesZone = ZoneId.of("America/Los_Angeles");
ZonedDateTime losAngelesTime = ZonedDateTime.now(losAngelesZone);
System.out.println(losAngelesTime); // 输出 "2023-03-09T00:35:18.326292-08:00[America/Los_Angeles]"
  • Period 和 Duration 类

Period 类代表一段时间,例如“3 年 5 个月 2 天”,Duration 类代表一段持续时间,例如“2 小时 30 分钟”。

以下是一些使用 Period 和 Duration 的示例代码:

// 创建 Period 和 Duration 对象
Period period = Period.of(1, 6, 0); // 代表一段时间:1 年 6 个月
Duration duration = Duration.ofHours(2).plusMinutes(30); // 代表一段持续时间:2 小时 30 分钟// 在 LocalDate 和 LocalDateTime 上应用 Period
LocalDate date = LocalDate.now();
LocalDate newDate = date.plus(period);
System.out.println(newDate); // 输出当前日期加上 1 年 6 个月后的日期LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime newDateTime = dateTime.plus(period);
System.out.println(newDateTime); // 输出当前日期时间加上 1 年 6 个月后的日期时间// 在 LocalTime 和 LocalDateTime 上应用 Duration
LocalTime time = LocalTime.now();
LocalTime newTime = time.plus(duration);
System.out.println(newTime); // 输出当前时间加上 2 小时 30 分钟后的时间LocalDateTime newDateTime2 = dateTime.plus(duration);
System.out.println(newDateTime2); // 输出当前日期时间加上 2 小时 30 分钟后的日期时间
  • DateTimeFormatter 类

DateTimeFormatter 类用于格式化和解析日期时间。它是线程安全的,并且提供了一组预定义的格式化器,也支持自定义格式化器。

以下是一些使用 DateTimeFormatter 的示例代码:

// 使用预定义格式化器格式化日期时间
LocalDateTime dateTime = LocalDateTime.now();
String formattedDateTime = DateTimeFormatter.ISO_DATE_TIME.format(dateTime);
System.out.println(formattedDateTime); // 输出格式为 "2023-03-09T16:48:35.104253"// 使用自定义格式化器格式化日期时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
String formattedDateTime2 = formatter.format(dateTime);
System.out.println(formattedDateTime2); // 输出格式为 "2023/03/09 16:48:35"

使用Date对象需要注意的问题是其存在线程安全性问题,如果多个线程同时访问同一个Date对象,可能会出现数据混乱的情况。

相关文章:

Java 日期时间

Java 日期时间是 Java 标准库中一个非常重要的部分,它提供了丰富的 API 来处理日期、时间以及日期时间。在 Java 应用程序中,我们经常需要处理日期时间相关的操作,例如计算两个日期之间的差、将日期时间转换为不同的时区等。在本篇文章中&…...

Face Forgery Suvery

文章目录Face ForgeryFace Forgery classAttribute ManipulationExpression SwapIdentity SwapEntire Face SynthesisFace Forgery DetectionLow-levelOn the Detection of Digital Face Manipulation(CVPR2020)High-levelProtecting World Leaders Against Deep FakesDetectin…...

案例学习--016 消息队列作用和意义

简介MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订阅队列中的消息。主要产品有:ActiveMQ、RocketMQ、Rabb…...

【MySQL】MySQL的锁机制

目录 概述 MyISAM 表锁 InnoDB行锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。 在数据库中,除传统的 计算资源(如 CPU、RAM、I/O 等)的争用以外,数据也是一种供许多用户共…...

HTML 背景

一个富有美感的背景会让站点看上去更加高级、更有吸引力。本篇为大家来的是 HTML 背景相关内容。 背景&#xff08;Backgrounds&#xff09; <body> 拥有两个配置背景的标签。背景可以是颜色或者图像。 背景颜色&#xff08;Bgcolor&#xff09; 背景颜色属性将背景设…...

Lombok

文章目录简介原理安装常用Getter、SetterToStringEqualsAndHashCodeNonNullNoArgsConstructor、RequiredArgsConstructor、AllArgsConstructorDATABuilderLogvalCleanup简介 Project Lombok is a java library that automatically plugs into your editor and build tools, spi…...

Koa源码学习

前言 koa是一个非常流行的Node.js http框架。本文我们来学习下它的使用和相关源码 来自官网的介绍&#xff1a; Koa 是一个新的 web 框架&#xff0c;由 Express 幕后的原班人马打造&#xff0c; 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。…...

一种延迟加载自定义元素的方法

您可能实际上并不需要所有这些&#xff1b;通常有一个更简单的方法。如果有意使用&#xff0c;此处显示的技术可能仍然对您的工具集有用。 为了保持一致性&#xff0c;我们希望我们的自动加载器也成为一个自定义元素——这也意味着我们可以通过 HTML 轻松配置它。但首先&#…...

Pytho经典面试题荟萃:第一期

目录 一、面试题 二、参考答案 解释器和编译器的区别 解释器 编译器 Python 的解释过程 Python 内存管理 Python 内存分配 引用计数 垃圾回收 其他内存管理技术 多重继承 多重继承带来的问题 命名冲突 菱形继承问题 解决多重继承带来的问题 方法重写 调用 su…...

01背包问题(大彻大悟版)

背包问题身为一个非常经典的动态规划问题&#xff0c;理清思路很重要&#xff0c;在经过多次观看y总视频和b站解析&#xff0c;加上CSDN的文章辅助&#xff0c;我终于从很多不理解到大彻大悟&#xff0c;下面是我对于背包问题思路的总结&#xff0c;有问题的话欢迎指出。谈到背…...

【麒麟服务器操作系统忘记开机密码怎么办?---银河麒麟服务器操作系统更改用户密码】

银河麒麟服务器操作系统更改用户密码 1.启动主机进入 grub 菜单&#xff0c;如图 1.1 以最新版本 Kylin-Server-10-SP2-x86-Release-Build09-20210524 为例。 图 1.1 grub 菜单 2 编辑 kernel 2.1按下”e”输入&#xff0c;输入用户名和密码&#xff08;root/Kylin123123&…...

华为OD机试(20222023)考点分类

字符串,数组,集合操作 题库分值序号题目考点 or 实现Old1001敏感字段加密字符串,数组,集合操作Old1002IPv4地址转换成整数字符串,数组,集合操作Old1006字符串分割字符串,数组,集合操作Old1007...

初级篇 3 - HTML 或 CSS 文件中不懂的标签属性详解

目录一、遇到的不懂的标签属性详解1、meta 标签的 http-equiv 属性(元标签)二、遇到的 CSS 不懂的属性详解vertical-align三、如何规避 HTML 自动换行 - 脱离文档流配置属性 display: inline-block理解 inline、inline-block、blockinline总结&#xff1a;四、导航栏自动弹出子…...

【C语言】每日刷题 —— 牛客语法篇(4)

&#x1f680;&#x1f680;前言 大家好&#xff0c;继续更新专栏 c_牛客&#xff0c;不出意外的话每天更新十道题&#xff0c;难度也是从易到难&#xff0c;自己复习的同时也希望能帮助到大家&#xff0c;题目答案会根据我所学到的知识提供最优解。 &#x1f3e1;个人主页&am…...

HashMap ConcurrentHashMap介绍

目录 HashMap 数据结构 重要成员变量 Jdk7-扩容死锁分析 单线程扩容 多线程扩容 Jdk8-扩容 ConcurrentHashMap 数据结构 并发安全控制 源码原理分析 重要成员变量 协助扩容helpTransfer 扩容transfer 总结 CopyOnWrite机制 源码原理 HashMap 数据结构 数组…...

C++语法规则3(C++面向对象)

多态 C多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函数&#xff1b; 形成多态必须具备三个条件&#xff1a; 必须存在继承关系&#xff1b;继承关系必须有同名虚函数&#xff08;其中虚函数是在基类中使用关键字 virtual 声明的函数&#…...

Python tkinter 如何实现网站下载工具?将所有数据一键获取

前言 铁汁们有没有想过&#xff0c;如何把几个代码的功能结合到一起呢&#xff1f; 有想过的话&#xff0c;有没有实现过呢&#xff1f; 其实很简单的啊&#xff0c;咱就写一个界面就好了&#xff0c;想要哪个代码运行&#xff0c;鼠标轻轻一点就行 开发环境 python 3.8: 解…...

第六章:C语言数据结构与算法初阶之栈

系列文章目录 文章目录系列文章目录前言一、栈二、栈的实现三、接口函数的实现1、初始化2、销毁栈3、压栈与出栈4、判空5、元素个数6、返回栈顶元素四、栈中元素的访问总结前言 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 一、…...

Android学习之WebView

什么是WebView WebView是Android中UI组件的一种&#xff0c;WebView基于webkit内核&#xff0c;不过由于兼容性的原因在Android5.0后改为了Chromium内核。 WebView可以用来展示网页&#xff0c;常用于我们不想打开浏览器但又想浏览网页的情况。 WebView的使用 WebVeiw的常用…...

3/11 考试总结

时间安排 7:30–7:50 读题&#xff0c;T1 是个利用随机性的题目&#xff0c;T2 dp,T3 不知道是啥。 7:50–8:30 T1,对于随机有个结论时最值突变不超过 log &#xff0c;于是可以处理出所有 log 个区间然后统计答案&#xff0c;但这暴力做是个 3log 铁定过不去。 8:30–8:50 T2…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...