【JavaSE】日期时间类(API)

一、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); // 23
        System.out.println(c.get(Calendar.DAY_OF_YEAR)); // 113
        
        // getTime(): 日历类-->Date
        Date 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.840
		System.out.println(localdate); // 2022-04-23
		System.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-23
        System.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()); // 113

        System.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.992
        System.out.println(localDateTime2); // 2022-04-23T22:06:26.992
        System.out.println(localDateTime3); // 2022-04-30T12:06:26.992
    }
}

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

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

        // minus
        LocalDateTime localDateTime4 = localDateTime.minusDays(8);
        LocalDateTime localDateTime5 = localDateTime.minusYears(4);
        System.out.println(localDateTime); // 2022-04-23T12:17:36.538
        System.out.println(localDateTime4); // 2022-04-15T12:17:36.538
        System.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
	}
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

り澄忆秋、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值