Java基础--日期API学习
创始人
2025-05-30 19:40:19

一、前言

        java标准库中,最早提供了两种处理日期和时间的类,但是由于很多问题,很多方法都已经弃用了,在JAVA8中引入了java.time包,解决了长久以来存在的诸多弊端。java原本自带的java.util.Date和java.util.Calendar类,实际上这两种类会有线程不安全的风险。

二、jdk8之前的api

一、java.lang.System类

1、System类提供的public static longcurrentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法使用于计算时间差

2、计算世界时间的主要标准有

  1. UTC(Coordinated Universal Time):协调世界时间
  2. GMT(Greenwich Mean Time):格林尼治时间,也是世界时
  3. CST(Central Standard Time):古巴时间 

二、java.util.Date

一、构造器:

1、Date():使用无参构造器创建的对象可以获取本地当前时间。

2、Date(long date)

二、常用方法

1、getTime():返回自1970年1月1日00:00:00 GMT以来此Date对象表示的毫秒数。

2、toString():把此Date对象转换为以下形式的String:dowmondd hh:mm:ss zzz

yyyy其中:dow是一周中的某一天(Sun, Mon, Tue,Wed, Thu, Fri, Sat),zzz是时间

标准。

3、其他把部分方法都过时了

三、java.text.SimplateDateFormat类

1、Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类。

他允许进行:

格式化:日期->文本

解析:文本->日期

2、格式化:

1、SimpateDateFormat():使用默认的模式和语言环境创建对象。

2、该构造方法可以用参数pattern指定的格式创建一个对象,该对象调用:3的方法

3、public String format(Date date):方法格式化时间对象date

3、解析:

1、public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。

四、栗子

// 产生一个Date实例
Date date= newDate();  
// 产生一个formater格式化的实例                                                              SimpleDateFormat formater = new SimpleDateFormat();                                        // 打印输出默认的格式                                                        System.out.println(formater.format(date));
SimpleDateFormat  formater2= new SimpleDateFormat("yyyy年MM月dd日EEE HH:mm:ss");
System.out.println(formater2.format(date));try{
// 实例化一个指定的格式对象
Date date2= formater2.parse("2008年08月08日星期一08:08:08");
// 将指定的日期解析后格式化按指定的格式输出
System.out.println(date2.toString());
} catch(ParseException e)
{
e.printStackTrace();
}

三、java.util.Calendar日历类

一、Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。

 二、获取Calendar实例的方法

1、使用Calendar.getInstance()方法

2、调用它的子类GregorianCalendar的构造器。

三、一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND

1、public void set(int field,int value)

2、public void add(int field,int amount)

3、public final Date getTime()

4、public final void setTime(Date date)

注意:获取月份时:一月是0,二月是1,以此类推,12月是11。获取星期时:周日是1,周二是2,。。。。周六是7

四、栗子

Calendar calendar = Calendar.getInstance();
// 从一个Calendar 对象中获取Date 对象
Date date = calendar.getTime();
System.out.println("data1:+"+date);
// 使用给定的Date 设置此Calendar 的时间
date = new Date(234234235235L);
System.out.println("data2:+"+date);
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, 8);
System.out.println("设置为当前时间日期为8号,时间是:" + calendar.getTime());
calendar.add(Calendar.HOUR, 2);
System.out.println("当前时间加2小时后,时间是:" + calendar.getTime());
calendar.add(Calendar.MONTH, -2);
System.out.println("当前日期减2个月后,时间是:" + calendar.getTime()

data1:+Sat Mar 18 17:04:06 CST 2023
data2:+Sat Jun 04 09:03:55 CST 1977
设置为当前时间日期为8号,时间是:Wed Jun 08 09:03:55 CST 1977
当前时间加2小时后,时间是:Wed Jun 08 11:03:55 CST 1977
当前日期减2个月后,时间是:Fri Apr 08 11:03:55 CST 1977

三、为什么会出现新的日期API

一、jdk8之前的SimpleDateFormat会有线程安全问题

1、栗子

使用十个线程,同一个SimpleDateFormat 对象解析日期文本
public class DateTest {final static SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{try {Date parse = simple.parse("2023-03-18 18:07:04");System.out.println(parse);} catch (ParseException e) {e.printStackTrace();}}).start();}}
}

2、结果

3、原因 

在simple.parse("2023-03-18 18:07:04");这个方法里,

 

 

 二、Date类以及Calendar类问题2

Date类以及Calendar类出现之前,枚举类型是还没有出现的,所以在使用Calendar设置日期、月份、时间,(都是直接使用整型放到方法参数里,魔法值)所以在字段中使用整数常量导致整数常量都是可变的,而不是线程安全的,且还不满足开发规范。为了解决这个问题,标准库中就引入了,java.sql.Date作为java.util.Date的子类,但是还是没能彻底解决这个问题。

四、jdk8中新日期时间API

jdk8提供的最新类均生成不可变实例,他们是线程安全的,并且这些类不提供公共构造函数,只能通过工厂方法加以实例化。

一、常用类概述与功能介绍

一、Instant类:返回的当前时间,是格林尼治时间,

instant类对时间轴上的单一瞬时点建模,也就是时间戳。可用于记录应用程序中的事件时间戳。

二、Duration类

表示秒或纳秒时间间隔,适合处理较短的时间,需要更高的精确性。

三、Period类

表示一段时间的年、月、日

四、LocalDate(yyyy-MM-dd)、LocalTime(秒后面表示的是纳秒)、LocalDateTime

表示不可变的日期时间对象,表示使用ISO-8601日历系统的日期、时间、日期和时间。

它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息

五、ZonedDateTime类:表示的是当前时区的当前时间

具有时区的日期时间的不可变表示,此类存储的所有日期和时间字段,精确到纳秒,时区为区域偏移量,用于处理模糊的本地日期时间。

在java中获取时区,通过ZoneId的getAvailableZoneIds方法可以获取到一个Set集合,集合中封装了600个时区。

注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法,也就是公历

相关内容

热门资讯

Git Actions自动发布... Git Actions自动发布部署,非最完善但足够完善和上手的一篇 文章最后附带完整...
【Java (一:12-4 D... DTD&schema 笔记记录一、DTD&schema1. xml约束分类DTD&schema1.1...
#ubuntu# #perf#... 关于 perf相关内容,抓取命令较多,当需要大量数据时每次输入命令会比较...
计算机图形学 | 可编程渲染管... 计算机图形学 | 可编程渲染管线计算机图形学 | 可编程渲染管线3.1 从固定到可编程图形编程的发展...
【FPGA实验2】二进制转为格... 关于FPGA入门实验2——二进制到格雷码的转换的一个记录 实验中作用到的仪器信息: 芯...
代码随想录算法训练营第四十九天... LeetCode 121 买卖股票的最佳时机题目链接:https://leetcode...
损失2亿美元后续,Euler正... 损失金额约2亿美元的Euler finance 闪电贷攻击已经成为2023年最大的去中心化金融黑客攻...
pb清空数组 1、 清空数组 string a[],b[] a[1] = '1';a[1] = '2';a[1] ...
嘉兴市联合上海证券交易所举办科... 为进一步拓宽科创企业融资渠道、优化发行机制,全力支持科技创新,5月30日,嘉兴市联合上海证券交易所举...
全网最详细,python接口自... 目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目...
专业、简单、稳定,融云重新定义... 艾瑞咨询《2023 年全球互联网通信云行业研究报告》(下简称《报告》)显...
没有Unity,没想到居然还有... 搞什么硬件,当然搞得是安卓手机当然多年前,哥是有去过中兴面试的ÿ...
OJ练习第52题——插入区间 插入区间 力扣链接:57.插入区间 题目描述 给你一个 无重叠的 ,按照...
【分享】为什么我设计的PCB很... 同事都很奇怪,为什么我设计的PCB都很少出错,而他们设计的PCB...
神经科学年鉴 | 全面综述情绪... 导读情绪是经历和行为的基础,影响和激励我们生活的方方面面。几个世纪以来,...
雅克比矩阵学习笔记 前置 假设f:Rn→Rmf:R_n\to R_mf:Rn​→Rm​是从nnn维欧氏空间线性映射到到m...
国产操作系统第一股,杨涛的麒麟... 文丨熔财经作者|星影随着chatGPT和AI技术的火热,国产芯片和操作系统能否适应人机...
原创 扛... 据报道,外交部副部长马朝旭与美国常务副国务卿兰多通电话的消息引发关注。尽管中美双方新闻稿内容简洁,但...
重大违法,强制退市,周五停牌 每天三分钟 公告很轻松 双林股份拟定增募资不超15亿元;光洋股份:终止购买银球科技100%股权等事项...
基于C++的AI五子棋游戏项目... 项目资源下载 基于C++的AI五子棋游戏项目源码压缩包下载地址基于C+...
人工智能能否取代软硬件开发工程... 版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog....
CGI编程 1.什么是CGI?   CGI是通用网关接口(Common Gateway Interface);是...
windows下远程连接aws... 一:安装或更新kubectlKubectl 是一个命令行工具,用于与 K...
jemeter-arthas做... jemeter-arthas做接口压测 一、jemeter 是一款压力测试工具,使用如...
maven的pom依赖配置介绍... 依赖模板 ch.qos.logbacklogback-classic1.4.4test
知识点梳理2408482-09... 基础产品数据(Basic Product Data):CA...
牛顿-拉弗森算法 这是一种迭代算法,为了求解多变量方程f⃗(x⃗)=0⃗\vec{f}(\vec...
linux clash部署 linux clash部署linux clash 部署使用一 环境二 下载1 下载2 解压三 配置1...
国科大计算机算法分析与设计1—... 写在前面 国科大算法复习的时候,想着复习一下平常的作业题,也正好记录一下...
提前涨停!这一A股控制权生变 ... 【导读】实控人丁福如筹划公司股份协议转让事宜,菲林格尔股票停牌中国基金报记者 牛思若5月30日,菲林...