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日历系统是国际标准化组织制定的现代公民的日期和时间的表示法,也就是公历

相关内容

热门资讯

2025上半年哪些国内新游最赚... 文 | 点点数据,作者 | April Z转眼间2025年已经过半,根据今年已经发布的《中国游戏产业...
两度易主、三任托管,这一次弘元... 文 | 华夏能源网在第二次破产重整后,“光伏老厂”无锡尚德迎来新一任托管方。华夏能源网(公众号hxn...
“身价暴涨”500%,蜜雪冰城... 文 | 电商在线“入行十年来,第一次见到这么贵的黄柠檬。”近日,“柠檬疯涨似黄金”“柠檬水成本飙升”...
青岛造芯新势力突击“联动”无锡... 7月11日复牌首日,长龄液压(605389.SH)以一字涨停告别两连跌阴霾,股价强势反弹的核心推力,...
对标泡泡玛特?AI玩具厂商的必... 文|执牛耳传媒从产业基础看,AI 玩具凭借场景多元、客群广泛、产业链成熟等优势,早已成为 AI 技术...