Java 时间日期类API

Java 关于日期时间API

文章目录

  • Java 关于日期时间API
    • JDK8之前
      • System类的方法
      • java.util.Date
      • Java.sql.Date
      • java.text.SimpleDateFormat
      • java.util.Calendar(日历)
    • JDK8.0,新日期时间API
      • java.time
      • Instant 瞬时
      • 与传统日期处理的转换

Java中关于日期时间API分为JDK8之前JDK8两类日期时间API

JDK8之前

System类的方法

  • currentTimeMillis() 用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。

    获取当前时间对应的毫秒数,long类型,时间戳

    当前时间与1970年1月1日0时0分0秒之间的毫秒数

    常用来计算时间差

java.util.Date

构造器
Date():使用无参构造器创建的对象可以获取本地当前时间。
Date(long 毫秒数):把该毫秒值换算成日期时间对象
常用方法
getTime(): 返回自 19701100:00:00 GMT 以来此 Date 对象表示的毫秒数。
toString(): 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。
import java.util.Date;
public DateTimeTest{public static void main(String []args){Date d1 = new Date();					//创建一个基于当前系统时间Date的实例System.out.println(d1);System.out.println(d1.toString());System.out.println(d1.getTime());		//输出对应毫秒数Date d2 = new Date(1718987075508L);		//创建一个基于指定时间戳的Date的实例System.out.println(d2.toString());}
}
//输出结果
Sat Jun 22 00:26:26 CST 2024
Sat Jun 22 00:26:26 CST 2024
1718987186574
Sat Jun 22 00:24:35 CST 2024

Java.sql.Date

import java.sql.Date;
public class DateTest{public static void main(String []args){Date d1 = new Date(1718987075508L);System.out.println(d1.toString());System.out.println(d1.getTime());}
}
//输出结果
2024-06-22
1718987075508

java.text.SimpleDateFormat

  • java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类
  • 可以进行格式化 : 日期 ——> 文本
  • 可以进行解析: 文本——>日期 简单来说,将字符串转化为时间
import java.text.SimpleDateFormat;public void test2() throws ParseException {
//        格式化 , 将日期转化为字符串SimpleDateFormat sdf = new SimpleDateFormat();java.util.Date date = new Date();String strDate = sdf.format(date);System.out.println(strDate);    //2024/6/22 00:56
//          解析,将字符串转化为日期Date date1 = sdf.parse("2024/6/22 00:54");System.out.println(date1);  //Sat Jun 22 00:54:00 CST 2024}

也可以根据自己需求,制定日期的格式

日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母 'A''Z''a''z' 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来,以免进行解释。"''" 表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。

定义了以下模式字母(所有其他字符 'A''Z''a''z' 都被保留):

字母日期或时间元素表示示例
GEra 标志符TextAD
yYear1996; 96
M年中的月份MonthJuly; Jul; 07
w年中的周数Number27
W月份中的周数Number2
D年中的天数Number189
d月份中的天数Number10
F月份中的星期Number2
E星期中的天数TextTuesday; Tue
aAm/pm 标记TextPM
H一天中的小时数(0-23)Number0
k一天中的小时数(1-24)Number24
Kam/pm 中的小时数(0-11)Number0
ham/pm 中的小时数(1-12)Number12
m小时中的分钟数Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zonePacific Standard Time; PST; GMT-08:00
Z时区RFC 822 time zone-0800
日期和时间模式结果
"yyyy.MM.dd G 'at' HH:mm:ss z"2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"Wed, Jul 4, '01
"h:mm a"12:08 PM
"hh 'o''clock' a, zzzz"12 o'clock PM, Pacific Daylight Time
"K:mm a, z"0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"2001-07-04T12:08:56.235-0700

例如,EEE, MMM d, ''yy,则输出会按照Wed, Jul 4, '01 格式

public class Test{public void test2() throws ParseException {
//        格式化 , 将日期转化为字符串SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d, ''yy");java.util.Date date = new Date();String strDate = sdf.format(date);System.out.println(strDate);  
//          解析,将字符串转化为日期Date date1 = sdf.parse(strDate);System.out.println(date1);  }
}
//输出
//周六, 6月 22, '24
//Sat Jun 22 00:00:00 CST 2024

Date有两种包中都存在java.util.Datejava.sql.Date,如何将控制台获取的年月日的字符串数据,保存在数据库中?

public class DateTest{public static void main(String []args){java.util.Date d1 = new Date();java.sql.Date d2 = new java.sql.Date(d1.getTime());}
}

java.util.Calendar(日历)

calendar是一个抽象类,需要创建子类的实例

获取Calendar实例的方法

  • 使用Calendar.getInstance()方法
  • 调用它的子类GregorianCalendar(公历)的构造器。

常用方法

- public int get(int field):返回给定日历字段的值
- public void set(int field,int value) :将给定的日历字段设置为指定的值
- public void add(int field,int amount):根据日历的规则,为给定的日历字段添加或者减去指定的时间量
- public final Date getTime():将Calendar转成Date对象
- public final void setTime(Date date):使用指定的Date对象重置Calendar的时间
public class Test{public static void main(String []args){Calendar calendar = Calendar.getInstance();//get(int field)System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //22//set(int field,xx)calendar.set(Calendar.DAY_OF_MONTH,22);System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //22//add(int field,xx)calendar.add(Calendar.DAY_OF_MONTH,1);System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //22calendar.add(Calendar.DAY_OF_MONTH,5);System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //28//getTime()  将calender——>DateDate date = calendar.getTime();System.out.println(date);           //Fri Jun 28 01:27:04 CST 2024//setTime()  将Date ——> calender  使用指定Date设置Calendercalendar.setTime(new Date());System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //22}
}

JDK8.0,新日期时间API

Calendar和Date存在着一些问题

  • 可变性:像日期和时间这样的类应该是不可变的。

  • 偏移性:Date中的年份是从1900开始的,而月份都从0开始。

  • 格式化:格式化只对Date有用,Calendar则不行。

  • 此外,它们也不是线程安全的;不能处理闰秒等。

public class Test{public static void main(String []args){//Calendar可变性Calendar calendar = Calendar.getInstance();System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //22calendar.set(Calendar.DAY_OF_MONTH,4);System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //4//偏移性Date d1 = new Date(2022,12,1);System.out.println(d1.toString());  //Mon Jan 01 00:00:00 CST 3923 ,此时是基于1900来说的2022年}
}

对日期和时间的操作,在java 8 引入新的API,可以正常使用

java.time

Java 8 以一个新的开始为 Java 创建优秀的 API。新的日期时间API包含:

  • java.time – 包含值对象的基础包
  • java.time.chrono – 提供对不同的日历系统的访问。
  • java.time.format – 格式化和解析时间和日期
  • java.time.temporal – 包括底层框架和扩展特性
  • java.time.zone – 包含时区支持的类

本地日期时间:LocalDate、LocalTime、LocalDateTime

方法描述
now() / now(ZoneId zone)静态方法,根据当前时间创建对象/指定时区的对象
of(xx,xx,xx,xx,xx,xxx)静态方法,根据指定日期/时间创建对象
getDayOfMonth()/getDayOfYear()获得月份天数(1-31) /获得年份天数(1-366)
getDayOfWeek()获得星期几(返回一个 DayOfWeek 枚举值)
getMonth()获得月份, 返回一个 Month 枚举值
getMonthValue() / getYear()获得月份(1-12) /获得年份
getHours()/getMinute()/getSecond()获得当前对象对应的小时、分钟、秒
withDayOfMonth()/withDayOfYear()/withMonth()/withYear()将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
with(TemporalAdjuster t)将当前日期时间设置为校对器指定的日期时间
plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours()向当前对象添加几天、几周、几个月、几年、几小时
minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours()从当前对象减去几月、几周、几天、几年、几小时
plus(TemporalAmount t)/minus(TemporalAmount t)添加或减少一个 Duration 或 Period
isBefore()/isAfter()比较两个 LocalDate
isLeapYear()判断是否是闰年(在LocalDate类中声明)
format(DateTimeFormatter t)格式化本地日期、时间,返回一个字符串
parse(Charsequence text)将指定格式的字符串解析为日期、时间
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Test{public static void main(String []args){
//JDK8 的api, LocalDate , LocalTime, LocalDateTime//now(),获取当前日期和时间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-22//01:48:23.292879500//2024-06-22T01:48:23.294301//of(): 获取指定日期,时间的对应实例LocalDate localDate1 = LocalDate.of(2024,6,22);LocalTime localTime1 = LocalTime.of(12,3,45);System.out.println(localDate1);System.out.println(localTime1);//2024-06-22//12:03:45//getXXX()System.out.println(localDate1.getMonth());  //JUNESystem.out.println(localDate1.getDayOfYear());  //174//不可变性//使用withXXX()系列方法,可以将日期修改为指定日期,并返回值System.out.println(localDateTime);LocalDateTime localDateTime1 = localDateTime.withYear(2023);System.out.println(localDateTime1);System.out.println(localDateTime);//2024-06-22T01:57:04.071432400//2023-06-22T01:57:04.071432400     返回值赋道localDateTime1中了,但localDateTime没有改变//2024-06-22T01:57:04.071432400}
}

Instant 瞬时

  • Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。
    • 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
  • java.time.Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。
方法描述
now()静态方法,返回默认UTC时区的Instant类的对象
ofEpochMilli(long epochMilli)静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
atOffset(ZoneOffset offset)结合即时的偏移来创建一个 OffsetDateTime
toEpochMilli()返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
public class InstantTest{public static void main(String []args){Instant instant = Instant.now();System.out.println(instant);//2024-06-21T18:01:37.922280800Zlong milliTime = instant.toEpochMilli();System.out.println(milliTime);//1718993008494}
}

日期时间格式化:DateTimeFormatter

ofPattern(String pattern)静态方法,返回一个指定字符串格式的DateTimeFormatter
format(TemporalAccessor t)格式化一个日期、时间,返回字符串
parse(CharSequence text)将指定格式的字符序列解析为一个日期、时间
public class Test{public static void main(String []args){//自定义的格式,ofPattern()DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");//格式化,日期、时间——>字符串LocalDateTime localDateTime = LocalDateTime.now();String strDateTime = dateTimeFormatter.format(localDateTime);System.out.println(strDateTime);//2024-06-22 02:07:41//解析,将字符串——> 日期、时间TemporalAccessor temporalAccessor = dateTimeFormatter.parse("2022/12/05 15:04:44");LocalDateTime localDateTime1 = LocalDateTime.from(temporalAccessor);System.out.println(localDateTime1);}
}

与传统日期处理的转换

To 遗留类From 遗留类
java.time.Instant与java.util.DateDate.from(instant)date.toInstant()
java.time.Instant与java.sql.TimestampTimestamp.from(instant)timestamp.toInstant()
java.time.ZonedDateTime与java.util.GregorianCalendarGregorianCalendar.from(zonedDateTime)cal.toZonedDateTime()
java.time.LocalDate与java.sql.TimeDate.valueOf(localDate)date.toLocalDate()
java.time.LocalTime与java.sql.TimeDate.valueOf(localDate)date.toLocalTime()
java.time.LocalDateTime与java.sql.TimestampTimestamp.valueOf(localDateTime)timestamp.toLocalDateTime()
java.time.ZoneId与java.util.TimeZoneTimezone.getTimeZone(id)timeZone.toZoneId()
java.time.format.DateTimeFormatter与java.text.DateFormatformatter.toFormat()

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

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

相关文章

C++入门 vector部分模拟实现

目录 vector大致框架 vector常见接口模拟实现 begin迭代器 & end迭代器 capacity( ) & size( ) reserve operator[ ] push_back( ) & pop_back( ) sort vector大致框架 vector的内部的成员变量大概有三部分构成&#xff1a; namespace bit {template<c…

【Java算法】滑动窗口 上

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 &#x1f456;一. 长度最小的子数组 题目链接&#xff1a;209.长度最小的子数组 算法原理 滑动窗口 滑动窗口算法常用于处理数组/字符串等序列问题&#xff0c;通过定义一…

Java赋值运算符

Java赋值运算符分为以下&#xff1a; 符号 作用 说明 赋值 int a 10,把10赋值给变量a 加后赋值 ab,将ab的值赋值给变量a - 减后赋值 a-b,将a-b的值赋值给变量a* 乘后赋值 a*b,将a*b的值赋值给变量a / 除后赋值 a/b,将a/b的值赋值给变量a % 取余赋值 a%b,将a%b的值赋值给变量…

力扣84.柱状图中最大的矩形

力扣84.柱状图中最大的矩形 初始化pre_max 为-1 存距离最近的小于h[i]的元素下标 初始化suf_max 为 n 存距离最近的小于h[i]的元素下标 class Solution {public:int largestRectangleArea(vector<int>& heights) {int n heights.size();//分别初始化-1 和 nvect…

C#循环语句总结

前言 正所谓磨刀不误砍柴工&#xff0c;C#上位机软件开发能力的提升离不开对C#语法的精通&#xff0c;本文接着讲解C#语法知识中的循环语句&#xff0c;在C#程序开发中我们经常会用到各种循环语句&#xff0c;常见的有for循环、while循环&#xff0c;本文就是对C#中用到的各种…

贪心算法—

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。这种算法并不总是能找到全局最优解&#xff0c;但在某些问题上能提供足够好的解决方案。贪心算法的关键特性包括&#…

drogon orm分页问题,req->getJsonObject()为空会导致Segmentation fault

2024年6月22日17:14:12 req->getJsonObject()获取json数据的时候&#xff0c;如果没有提前判断 if (req->getJsonObject() nullptr){throw std::invalid_argument("参数json不能为空");}auto jsonPtr req->getJsonObject();官方文档&#xff1a;https://…

JR-8000系列机架式多路4K超高清光端机

集中式 4K超高清光传输设备 1 产品特性 ⚫ 支持高达 8 通道 SMPTE 全格式 SDI 信号输入 ⚫ 发送端带有 LOOPOUT 环出端口&#xff0c;具备消抖动功能&#xff0c;可作为信号调理或级联信号源使用 ⚫ 接收端支持双输出端口 ⚫ 支持传输速率&#xff1a;143Mbps-11.88Gbps ⚫…

Intel太无耻,跟着玩数字游戏还揭台积电的老底,工艺都是假的

在台积电的3纳米逐渐获得芯片企业认可的情况下&#xff0c;近日Intel却再次指出台积电的3纳米工艺并非真正的3纳米&#xff0c;与Intel的7纳米工艺差不多&#xff0c;这显示出Intel在芯片工艺研发方面日益落后的情况下确实有点慌了。 Intel指出它的7纳米工艺的晶体管密度达到1.…

python watchdog 配置文件热更新

目录 一、Watchdog示例 二、aiohttp服务配置热更新 在同事的golang代码中学习到了config.json热更新的功能&#xff0c;这里自己也学习了一下python写web服务的时候怎么来实现配置的热更新。主要是利用Watchdog这个第三方python库&#xff0c;来监控文件系统的改变&#xff0…

学习使用venv创建“python虚拟环境”

前言 使用python开发会经常面临的问题是&#xff1a;你会需要不同版本的python&#xff0c;而且就算同一个版本的python&#xff0c;不同的项目有很大可能会需要不同版本的包。而 “Python虚拟环境” 就是为了解决这个问题的。 目标 结合官方文档&#xff0c;自己动手实践来…

pytest是什么?怎么用?

pytest 是一个成熟的全功能 Python 测试框架&#xff0c;它可以帮助你编写更好、更简洁的测试代码。pytest 的特点包括简单易上手、支持参数化测试、可以很容易地集成到持续集成&#xff08;CI&#xff09;环境中&#xff0c;以及拥有大量的插件和扩展。 ### 如何使用 pytest&a…

开启声音的奇幻之旅:AI声音变换器的魔法秘籍与创意应用

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/这个充满科技魔力的时代&#xff0c;AI Voice Changer 就像一把神奇的钥匙&#xff0c;能为我们打开声音的魔法之门。今天&#xff0c;就让我带你…

JetBrains PyCharm 2024 mac/win版编程艺术,智慧新篇

JetBrains PyCharm 2024是一款功能强大的Python集成开发环境(IDE)&#xff0c;专为提升开发者的编程效率和体验而设计。这款IDE不仅继承了前代版本的优秀特性&#xff0c;还在多个方面进行了创新和改进&#xff0c;为Python开发者带来了全新的工作体验。 JetBrains PyCharm 20…

腰背肌筋膜炎怎么治疗最有效

腰背肌筋膜炎的治疗方法主要包括以下几种&#xff1a; 1、休息和物理治疗&#xff1a; 确保充足的休息&#xff0c;避免过度劳累&#xff0c;减少腰背部肌肉的负担。 物理治疗&#xff0c;如热敷或冷敷&#xff0c;可以缓解疼痛和肌肉紧张。热敷可以使用热水袋、热毛巾或电热垫…

linux普通: rocketmq的安装测试与可视化界面安装,git的 (linux) 安装

全文目录,一步到位 1.前言简介1.1 专栏传送门(rabbitmq) 2. rocketmq使用及安装2.0 开放端口2.1 rocketmq版本说明2.2 具体操作2.2.1 修改文件2.2.2 具体启动指令ps: 查看日志 2.3.3 jps查看java进程2.3.4 测试运行情况> 步骤一: 临时指定nameserver注册中心位置> 步骤二…

点云处理中阶 Sample Consensus(二)

目录 一、深入理解RSNSAC 二、RANSAC的缺点 三、PCL中常用的Sample Consensus 算法 四、参考资料 一、深入理解RSNSAC RANSAC是“RANdom SAmple Consensus”(随机抽样共识或采样一致性)的缩写,它是一种迭代方法,用于从包含异常值的一组数据中估计数学模型的参数。该算…

【机器学习】基于Softmax松弛技术的离散数据采样

1.引言 1.1.离散数据采样的意义 离散数据采样在深度学习中起着至关重要的作用&#xff0c;它直接影响到模型的性能、泛化能力、训练效率、鲁棒性和解释性。 首先&#xff0c;采样方法能够有效地平衡数据集中不同类别的样本数量&#xff0c;使得模型在训练时能够更均衡地学习…

实用软件下载:会声会影2023最新安装包及详细安装教程

可以说它不仅符合家庭或个人所需的影片剪辑功能&#xff0c;甚至能够挑战专业级的影片剪辑软件&#xff0c;适合一般大众使用&#xff0c;操作简单易懂&#xff0c;界面简洁明快。从总体上来看影片制作向导模式&#xff0c;只要三个步骤就可快速做出DV影片&#xff0c;入门初学…

乌班图Ubuntu 24.04 SSH Server 修改默认端口重启无效

试用最新的乌班图版本&#xff0c;常规修改ssh端口&#xff0c;修改完毕后重启sshd提示没有找到service&#xff0c;然后尝试去掉d重启ssh后查看状态&#xff0c;端口仍然是默认的22&#xff0c;各种尝试都试了不行&#xff0c;重启服务器后倒是端口修改成功了&#xff0c;心想…