【JavaSE】日期时间类(API)

文章目录

  • 一、JDK8 之前的日期时间API
    • 1.java.lang.System类
    • 2.java中两个Date类的使用
      • 2.1 java.util.Date类:
      • 2.2 java.sql.Date类:
    • 3.java.text.SimpleDateFormat类
    • 4.Calendar日历类
  • 二、JDK8 中新日期时间API
    • 1.LocalDate、LocalTime、LocalDateTime
    • 2.Instant
    • 3.DateTimeFormatter

一、JDK8 之前的日期时间API

1.java.lang.System类

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

public class Main{public static void main(String[] args){long start = System.currentTimeMillis();// 需要计算代码执行时间的代码String s = "abc";for(int i=0;i<10000;i++){s += i;}long end = System.currentTimeMillis();// 代码执行的时间System.out.println(end - start);}
}

 

2.java中两个Date类的使用

JDK1.0,第一代日期时间类API

2.1 java.util.Date类:

两个构造器:

  • Date date = new Date(); 创建一个对应当前时间的对象
  • Date date = new Date(long l); 创建一个指定时间戳的对象

两个方法:

  • toString()方法:显示当前的年、月、日、分、秒
  • getTime():获取当前 Date对象的时间戳(毫秒数)

 

2.2 java.sql.Date类:

对应数据库中的日期时间,该类是 java.lang.Date的子类

  • Date date = new Date(long l);

  • Date.toString(); 返回 年-月-日

  • Date.getTime(); 父类的 getTime()方法;

将 java.util.Date对象转换为 java.sql.Date对象:

  • Date date = new Date(); java.sql.Date date1 = new java.sql.Date(date.getTime());

 

3.java.text.SimpleDateFormat类

Date类的API不利于国际化,大部分被废弃了,SimpleDateFormat类 是一个不与语言环境有关的方式来格式化和解析日期的具体类
 
它允许进行 格式化: 日期 --> 字符串、解析:字符串–> 日期.

SimpleDateFormat的实例化:
 
空参: 以默认的形式格式化、解析
SimpleDateFormat sdf = new SimpleDateFormat();
 
有参: 以指定的形式格式化、解析
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
 
通常不使用默认形式进行格式化和解析,而以指定的形式格式化日期和解析字符串

在这里插入图片描述

 
格式化: 日期–>字符串

SimpleDateFormat sdf = new SimpleDateFormat();Date date = new Date(); // java.util.Date
String format = sdf.forat(date); // 以默认的形式格式化字符串System.out.println(date); // Fri Apr 22 21:24:38 CST 2022
System.out.println(format); // 22-4-22 下午9:24
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
String str = sdf.format(date);
System.out.println(str); // 2022-04-22 09:44:36

 
解析: 字符串–>日期

String str = "22-4-22 下午9:30";
Date date = null;
try {date = sdf.parse(str); // 以默认的形式解析字符串
} catch (ParseException e) {e.printStackTrace();
}
System.out.println(date1); // Fri Apr 22 21:30:00 CST 2022
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = null;
try {date = sdf.parse("2022-04-22 09:44:36");
} catch (ParseException e) {e.printStackTrace();
}
System.out.println(date); // Fri Apr 22 09:44:36 CST 2022

 

4.Calendar日历类

JDK1.1,Calendar引入后第一代日期时间类大多数方法被弃用,
Calendar类是一个抽象类,主要用于完成日期字段之间相互操作的功能

 
获取 Calendar实例的方法:

  • 使用 Calendar.getlnstance()方法
  • 调用它的子类 GregorianCalendar的构造器
     

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

  • public void set(int field,int value)
  • public void add(int field,int value)
  • public final Date getTime()
  • public final void setTime()
     

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

public class Main{public static void main(String[] args){Calendar c = Calendar.getInstance();// get()int day = c.get(Calendar.DAY_OF_MONTH);System.out.println(day); // 23System.out.println(c.get(Calendar.DAY_OF_YEAR)); // 113// getTime(): 日历类-->DateDate date = c.getTime(); // Sat Apr 23 10:56:39 CST 2022   System.out.println(date);// setTime():Date-->日历类Date date1 = new Date();calendar.setTime(date1);System.out.println(c.get(Calendar.DAY_OF_MONTH)); // 23}
}

 

二、JDK8 中新日期时间API

JDK8 之前的日期时间的问题:

  • 可变性:像日期时间这样的类应该是不可变的
  • 偏移性:Date中的年份是从1900开始的,而月份都从0开始
  • 格式化:格式化只对Date有效,Clandar则不行
  • 此外,他们也不是线程安全的;

 

1.LocalDate、LocalTime、LocalDateTime

LocalDate、LocalTime、LocalDateTime类是其中比较重要的几个类,他们的实例是不可变的对象,分别表示使用 ISO-8601日期系统的日期、时间。他们提供了简单的本地日期和时间,并不包含当前的时间信息,也不包含与时区相关的信息

  • LocalDate代表 ISO格式(yyyy-MM-dd) 的时间,可以存储生日、纪念日等日期
  • LocalTime表示一个时间,而不是日期
  • LocalDateTime用来表示日期和时间的,使用频率较高
     

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

 
实例化:
now(): 获取 当前的年、月、日、时、分、秒
of(): 获取 指定的年、月、日、时、分、秒

public class Main{public static void main(String[] args){// now()LocalTime localtime = LocalTime.now();LocalDate localdate = LocalDate.now();LocalDateTime localdatetime = LocalDateTime.now();System.out.println(localtime); // 11:36:26.840System.out.println(localdate); // 2022-04-23System.out.println(localdatetime); // 2022-04-23T11:36:26.840// of()LocalDate localDate = LocalDate.of(2022,4,23);LocalDateTime localdatetime1 = LocalDateTime.of(2022,4,23,11,47,40);System.out.println(localDate); // 2022-04-23System.out.println(localdatetime1); // 2022-04-23T11:47:40}
}

 
获取:
getXxx(): 获取年、月、日、时、分、秒

public class Main{public static void main(String[] args){LocalDateTime localdatetime = LocalDateTime.now();System.out.println(localdatetime.getDayOfMonth()); // 23(第23天,23号)System.out.println(localdatetime.getDayOfWeek()); // SATURDAY(第六天,周六)System.out.println(localdatetime.getDayOfYear()); // 113System.out.println(localdatetime.getMonth()); // APRIL(4月)System.out.println(localdatetime.getMonthValue()); // 4(数字)System.out.println(localdatetime.getHour()); // 11(时)}
}

 
设置:
withXxx():修改年、月、日、时、分、秒,返回一个新的对象(不改变原有对象)

public class Main{public static void main(String[] args) {LocalDateTime localDateTime = LocalDateTime.now();LocalDateTime localDateTime2 = localDateTime.withHour(22);LocalDateTime localDateTime3 = localDateTime.withDayOfMonth(30);System.out.println(localDateTime); // 2022-04-23T12:06:26.992System.out.println(localDateTime2); // 2022-04-23T22:06:26.992System.out.println(localDateTime3); // 2022-04-30T12:06:26.992}
}

plusXxx(): 增加年、月、日、时、分、秒,返回一个新的对象(不改变原有对象)
minusXxx(): 减少年、月、日、时、分、秒,返回一个新的对象(不改变原有对象)

public class Main{public static void main(String[] args) {LocalDateTime localDateTime = LocalDateTime.now();// plusLocalDateTime localDateTime2 = localDateTime.plusDays(8);LocalDateTime localDateTime3 = localDateTime.plusYears(4);System.out.println(localDateTime); // 2022-04-23T12:17:36.538System.out.println(localDateTime2); // 2022-05-01T12:17:36.538System.out.println(localDateTime3); // 2026-04-23T12:17:36.538// minusLocalDateTime localDateTime4 = localDateTime.minusDays(8);LocalDateTime localDateTime5 = localDateTime.minusYears(4);System.out.println(localDateTime); // 2022-04-23T12:17:36.538System.out.println(localDateTime4); // 2022-04-15T12:17:36.538System.out.println(localDateTime5); // 2018-04-23T12:17:36.538}
}

 

2.Instant

Instant: 时间线上的一个瞬时点。这可能被用来记录应用程序中的事件时间戳
 
在处理时间和日期时,我们通常会想到年、月、日、时、分、秒。然而,这只是时间的一人模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在java中,也是 从1970年开始,但以毫秒为单位。

Instant的使用,类似于 java.util.Date

now()方法

静态方法,返回默认UTC时区的Instant类的对象,获取的是本初子午线对应的标准时间

Instant instant = Instant.now();
System.out.println(instant); // 2022-04-23T05:11:36.038Z

 
ofEpochMilli(long epochMilli)方法

静态方法,返回在 1970-01-01 00:00:00基础上加上指定毫秒数之后的 Instant类对象

Instant instant = Instant.ofEpochMilli(1650690962224L);
System.out.println(instant); // 2022-04-23T05:16:02.224Z

 
atOffset(ZoneOffset offset)方法

结合即时的偏移(添加时间的偏移量)来创建一个 OffsetDateTime()

Instant instant = Instant.now();
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHour(8));
System.out.println(instant); // 2022-04-23T05:11:36.038Z
System.out.println(offsetDateTime); // 2022-04-23T13:11:36.038+08:00(时区时间偏移)

 
toEpochMilli()

返回 1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳

long l = instant.toEpochMilli();
System.out.println(l); // 1650690962224

 

3.DateTimeFormatter

java.time.format.DateTimeFormatter类,该类提供了三种格式化方法:
 
预定义的标准格式,如:
ISO_LOCAL_DATE_TIME; ISO_LOCAL_DATE; ISO_LOCAL_TIME
 
本地化相关的格式,如:
ofLocalizedDateTime(FormatStyle.LONG)
 
自定义的格式,如:
ofPattern(“yyyy-MM-dd hh:mm:ss E”);

 
ofPattern(String pattern)方法

静态方法,返回一个指定字符串格式的DateTimeFormatter对象

format(TemporalAccessor t)方法

格式化一个日期、时间,返回字符串

parse(CharSequence text)

将指定格式的字符串序列解析为一个日期、时间

 
自定义的方式格式化与解析:

public class Main{public static void main(String[] args){DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");LocalDateTime localDateTime = LocalDateTime.now();// 格式化String str = dateTimeFormatter.format(localDateTime);System.out.println(str); // 2022-04-23 01:54:08// 解析TemporalAccessor accessor = dateTimeFormatter.parse(str);System.out.println(accessor); // {MinuteOfHour=54, MicroOfSecond=0, MilliOfSecond=0, NanoOfSecond=0, SecondOfMinute=8, HourOfAmPm=1},ISO resolved to 2022-04-23}
}