java常用类06_时间处理类(上)

1.时间处理类概述

“时间如流水,一去不复返”,时间是一个一维的东东。所以,我们需要一把刻度尺来区表达和度量时间。在计算机世界,我们把1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一)。
在这里插入图片描述
我们用long类型的变量来表示时间,从基准时间往前几亿年,往后几亿年都能表示。如果想获得现在时刻的“时刻数值”,可以使用:

long now = System.currentTimeMillis();

这个“时刻数值”是所有时间类的核心值,年月日都是根据这个“数值”计算出来的。我们工作学习涉及的时间相关类有如下这些:
在这里插入图片描述

2.Date时间类

在标准Java类库中包含一个java.util.Date类,它的对象表示一个特定的瞬间,精确到毫秒。

Date类送JDK1.0开始就存在了,但因为它历史悠久,所以它的大部分构造器、方法都已经过时了,不再推荐使用了。

Date类提供了6个构造器,其中4个已经过时不再推荐使用(使用不再推荐的构造器编译器会提出警告信息,并导致程序性能、安全性等方面的问题),剩下的两个构造器如下:

Date() 创建一个代表当前日期时间的Date对象。
Date(long date) 指定的long型整数来创建一个Date对象,以表示自从标准基准时间以来的指定毫秒数。

标准基准时间:又称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT。

【示例】Date对象的创建方式

// 创建一个代表当前日期时间的Date对象。
Date date1 = new Date();
System.out.println(date1); // 输出:Wed Jan 03 22:22:38 CST 2018
// 指定毫秒数来创建一个Date对象。
Date date2 = new Date(1514984127939L);
System.out.println(date2); // 输出:Wed Jan 03 20:55:27 CST 2018

Date对象的大部分方法也已经弃用了,只剩下为数不多的几个方法:

boolean before(Date when):测试此日期是否在指定日期之后

boolean after(Date when):测试此日期是否在指定日期之前。

boolean equals(Object obj):比较两个日期的相等性。

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

void setTime(long time):使用给定的毫秒时间值设置现有的 Date对象。

【示例】根据两个日期对象返回相差天数

public int method(Date date1, Date date2) {
	// 1.把日期对象转化为毫秒数
	long time1 = date1.getTime();
	long time2 = date2.getTime();
	// 2.获取毫秒数的查值
	long result = Math.abs(time1 - time2);
	// 3.转化为天数
	int day = (int) Math.floor(result/1000/60/60/24);
	// 4.返回天数
	return day;
}

3.DateFormat类(了解)

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。实际上,它是Date的格式化工具,它能帮助我们格式化Date,进而将Date转换成我们想要的String字符串供我们使用。

但是从定义上可以发现,DateFormat类是一个抽象类,按照以往的思路,直接使用其子类实例化即可,但是DateFormat类本身的内部提供了可以直接为其实例化的操作。

得到日期的DateFormat对象:public final static DateFormat getDateTimeInstance()

得到日期时间的 DateFormat对象:public final static DateFormat getDateTimeInstance()

使用DateFormat类完成将Date对象转换成 String功能**:**public final String format(Date date)

使用DateFormat类完成将 String 转换成 Date功能:public Date parse(String source) throws ParseException,转换时,该String要符合指定格式,否则不能转换。

【示例】默认日期格式化转换案例

public static void main(String[] args) throws ParseException {
	// Date对象转化为String
	dateToString(new Date());
	// String转化为Date对象
	stringToDate("2017-12-03");
}
// String转化为Date对象
public static void stringToDate(String time) throws ParseException {
	// 实例化日期DateFormat对象
	DateFormat df = DateFormat.getDateInstance();
	// 字符串转化为Date对象,此处字符串格式应为:yyyy-MM-dd,否则抛出异常
	Date date = df.parse(time);
	System.out.println(date); // 输出:Sun Dec 03 00:00:00 CST 2017
}
// Date对象转化为String
public static void dateToString(Date date) {
	// 实例化日期DateFormat对象
	DateFormat df1 = DateFormat.getDateInstance();
	// 把Date对象转化为字符串
	String time1 = df1.format(date);
	System.out.println(time1); // 输出:2018-1-4

	// 实例化日期时间DateFormat对象
	DateFormat df2 = DateFormat.getDateTimeInstance();
	// 把Date对象转化为字符串
	String time2 = df2.format(date);
	System.out.println(time2); // 输出:2018-1-4 14:05:28
}

通过此类可以直接将Date类的显示进行合理的格式化操作,它支持格式化风格包括 FULL、LONG、MEDIUM 和 SHORT 共4种:

DateFormat.SHORT :恒定的短款式,例如“18-1-4”或“18-1-4 下午2:24”。

DateFormat.MEDIUM:中等风格图案的常数,例如“2018-1-4”或“2018-1-4 14:25:12”。

DateFormat.LONG :恒久的长款式,例如“2018年1月4日”或“2018年1月4日 下午02时24分20秒”。

DateFormat.FULL :恒定的全风格图案,例如“2018年1月4日 星期四”或“2018年1月4日 星期四 下午02时25分35秒 CST”。

【示例】指定日期格式化转换案例

public static void main(String[] args) throws ParseException {
	// Date对象转化为String
	dateToString1(new Date());
	// String转化为Date对象
	stringToDate1("2017年12月18日");
}
// String转化为Date对象
public static void stringToDate(String time) throws ParseException {
	// 实例化日期DateFormat对象
	DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
	// 字符串转化为Date对象,此处字符串格式应为:yyyy年MM月dd日,否则抛出异常
	Date date = df.parse(time);
	System.out.println(date); // 输出:Mon Dec 18 00:00:00 CST 2017
}
// Date对象转化为String
public static void dateToString(Date date) {
	// 指定格式实例化日期DateFormat对象,LONG格式
	DateFormat df1 = DateFormat.getDateInstance(DateFormat.LONG);
	String time1 = df1.format(date);
	System.out.println(time1); // 输出:2018年1月4日

	// 指定格式实例化日期时间DateFormat对象,LONG格式
	DateFormat df2 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
	String time2 = df2.format(date);
	System.out.println(time2); // 输出:2018年1月4日 下午02时29分41秒
}

4.SimpleDateFormat类

因为DateFormat格式化Date的功能有限,远远没有SimpleDateFormat强大。SimpleDateFormat类是抽象类DateFormat的子类,用于以区域设置敏感的方式格式化和解析日期。

关于Date、时间戳(long)和String类型之间的相互转换,主要是用SimpleDateFormat类来实现,在创建SimpleDateFormat对象时,我们可以指定格式来对日期和时间来进行格式化操作,然后再进行Date对象和字符串的转换。

指定格式规则如下:

  • 当出现 y 时,会将 y 替换成年。

  • 当出现 M 时,会将 M 替换成月。

  • 当出现 d 时,会将 d 替换成日。

  • 当出现 h 时,会将 h 替换成时(12小时制)。

  • 当出现 H 时,会将 H 替换成时(24小时制)。

  • 当出现 m 时,会将 m 替换成分。

  • 当出现 s 时,会将 s 替换成秒。

  • 当出现 S 时,会将 S 替换成毫秒。

  • 当出现D时,获得当前时间是今年的第几天。

  • 当出现w时,获得当前时间是今年的第几周。

  • 当出现W时,获得当前时间是本月的第几周。

【示例】自定义日期格式转换案例

public static void main(String[] args) throws ParseException {
	// Date对象转化为String
	dateToString(new Date());
	// String转化为Date对象
	stringToDate("2017年12月18日 23:11:20");
}
// String转化为Date对象
public static void stringToDate(String time) throws ParseException {
	DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
	Date date = df.parse(time);
	System.out.println(date); // 输出:Mon Dec 18 23:11:20 CST 2017
}
// Date对象转化为String
public static void dateToString(Date date) {
	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
	String time = df.format(date);
	System.out.println(time); // 输出:2018-01-04
}

【示例】获得当前时间是今年的第几天

DateFormat df = new SimpleDateFormat("D");
String day = df.format(new Date());
System.out.println("今天是今年的第" + day + "天");

5.Calendar日历类

Calendar 是日历类,为我们提供了关于日期计算的相关功能,比如:年、月、日、时、分、秒的展示和计算(Calendar 类的出现,替换掉了许多Date的方法)。

Calendar 为抽象类,Calendar 类在创建对象时并非直接创建,而是通过静态方法创建,然后返回创建好的子类GregorianCalendar对象。

【示例】创建当前日历对象案例

// 通过静态方法创建当前日期对象
Calendar calendar = Calendar.getInstance(); 
System.out.println(calendar);

GregorianCalendar是Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。

Calendar 类常用方法:

根据时间字段编号,获取相关日期元素值:public int get(int field)

以下是常见的get字段编号:

  • Calendar.YEAR 获取年份

  • Calendar.MONTH 获取月份,0表示1月,1表示2月,2表示3月,…,11表示12月

  • Calendar.DAY_OF_MONTH 获取本月的第几天

  • Calendar.DAY_OF_YEAR 获取本年的第几天

  • Calendar.HOUR_OF_DAY 小时,24小时制

  • Calendar.HOUR 小时,12小时制

  • Calendar.MINUTE 获取分钟

  • Calendar.SECOND 获取秒

  • Calendar.MILLISECOND 获取毫秒

  • Calendar.DAY_OF_YEAR 获取一年有多少天

  • Calendar.DAY_OF_WEEK 获取星期几,1表示星期日,2表示星期一,…,7表示星期六

【示例】获取相关日期元素案例

// 通过静态方法创建当前日期对象
Calendar calendar = Calendar.getInstance(); 
int year = calendar.get(Calendar.YEAR); // 获取年份
// 0表示1月,1表示2月,2表示3月,...,11表示12月
int month = calendar.get(Calendar.MONTH);// 获取月份
int day = calendar.get(Calendar.DAY_OF_MONTH); // 获取本月第几天
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 获取小时
int minute = calendar.get(Calendar.MINUTE); // 获取分钟
int second = calendar.get(Calendar.SECOND); // 获取秒
int milliSecond = calendar.get(Calendar.MILLISECOND); // 获取毫秒
// 1表示星期日,2表示星期一,...,7表示星期六
int week = calendar.get(Calendar.DAY_OF_WEEK); // 获取星期几
int days = calendar.get(Calendar.DAY_OF_YEAR); // 获取本年度第几天

l 设置相关日期元素值

根据时间字段编号,设置相关日期元素值。Field填写日期字段

public void set(int field, int value)

【示例】根据时间字段编号,单独设置日期元素案例

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.YEAR, 2017);  
calendar.set(Calendar.MONTH, 2);
calendar.set(Calendar.DAY_OF_MONTH, 22);
calendar.set(Calendar.HOUR_OF_DAY, 22);
calendar.set(Calendar.MINUTE, 12);
calendar.set(Calendar.SECOND, 22);
calendar.set(Calendar.MILLISECOND, 2);

根据年月日时分秒设置日期元素值

public final void set(int year, int month, int date)

public final void set(int year, int month, int date, int hour, int minute)

public final void set(int year, int month, int date, int hour, int minute, int second)

【示例】根据年月日时分秒设置日期元素值案例

Calendar calendar = Calendar.getInstance(); 
calendar.set(2018, 1, 23, 23, 23, 23);

根据时间字段编号,增加某值:public void add(int field, int amount)案例

// 通过静态方法创建当前日期对象
Calendar calendar = Calendar.getInstance(); 
// 把日期对象设置为指定时间
calendar.set(2018, 1, 8, 23, 10, 23);
// 修改当前时间为 4 天后
calendar.add(Calendar.DAY_OF_MONTH, 4);
// 修改当前时间为 5 小时前
calendar.add(Calendar.HOUR_OF_DAY, -5);
// 做完上述操作后,此时calendar对象保存的时间为:2018-02-12 18:10:23

l 日历对象和时间对象转化

从一个Calendar对象中获取Date对象方法:public final Date getTime()

将Date对象反应到一个Calendar对象中:public final void setTime(Date date)

【示例】Date和Calendar互换案例

// 通过静态方法创建当前日期对象
Calendar calendar = Calendar.getInstance(); 
// 获取日期对象中的Date对象
Date date = calendar.getTime();
// 给日期对象设置指定Date对象
calendar.setTime(date);

l 日历对象和时间对象转化

从一个Calendar对象中获取Date对象方法:public final Date getTime()

将Date对象反应到一个Calendar对象中:public final void setTime(Date date)

【示例】Date和Calendar互换案例

// 通过静态方法创建当前日期对象
Calendar calendar = Calendar.getInstance(); 
// 获取日期对象中的Date对象
Date date = calendar.getTime();
// 给日期对象设置指定Date对象
calendar.setTime(date);

ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。

发布了92 篇原创文章 · 获赞 0 · 访问量 2594

猜你喜欢

转载自blog.csdn.net/zhoujunfeng121/article/details/104784313
今日推荐