一、初始化时间对象的两种方式
Java的日期时间类在 java.util.Date
包中,Date 类用于表示日期时间,使用该类表示时间需要先使用其构造方法创建对象
1.1、Date 类提供两个构造方法来实例化 Date 对象。
Date() 无参构造函数使用当前日期和时间来初始化对象。
Date(long millisec) 有参构造函数接收一个参数,该参数是从 1970 年 1 月 1 日起的毫秒数。
示例演示
class test {public static void main(String[] args) {Date date1 = new Date();//调用Date无参构造,初始化一个时间对象System.out.println(date1);long nowTime = System.currentTimeMillis();//当前系统时间所经历的毫秒数System.out.println(nowTime);Date date2 = new Date(newTime);//使用毫秒数作为参数,调用Date有参构造初始化一个时间对象System.out.println(date2);}
}//运行结果
Tue Jul 11 15:08:41 CST 2023
1689059321476
Tue Jul 11 15:08:41 CST 2023
二、Date 类的常用方法
----------------------------------------------------------------------------------------------------------------------方法 | 说明
----------------------------------------------------------------------------------------------------------------------getTime() | 获得自 1970 年 1月 1日 00:00:00 GMT 开始到现在所经过的毫秒数 toString() 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一 天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。
----------------------------------------------------------------------------------------------------------------------
//下面的很少使用,了解即可after(Date when) | 测试当前日期是否在指定的日期之后 before(Date when) | 测试当前日期是否在指定的日期之前 setTime(long time) | 设置当前 Date 对象所表示的日期时间值,该值用以表示1970年1月1日 00:00:00 GMT 以后time毫秒的时间点
示例演示
class test {public static void main(String[] args) {Date date1 = new Date();System.out.println("日期:" + date1);System.out.println("日期toString():" + date1.toString());long nowTime = date1.getTime();//当前系统时间所经历的毫秒数System.out.println("自 1970 年 1 月 1 日 00:00:00 GMT 以来经历了" + nowTime + "毫秒");}
}//运行结果
日期:Wed Jul 12 10:50:24 CST 2023
日期toString():Wed Jul 12 10:50:24 CST 2023
自 1970 年 1 月 1 日 00:00:00 GMT 以来经历了1689130224202毫秒
三、日期时间格式化
3.1、String.format()
3.1.1、日期格式化
常用的日期转换格式符
=======================================================================================================================
转换符 说明 示例
-----------------------------------------------------------------------------------------------------------------------
%tY 4位年份 2023
%ty 2位年份 23
%tm 月份 05
%te 一个月中的某一天(1~31) 10
%td 一个月中的第几天(1~31) 03
%tj 一年中的第几天(1~366) 020
%tb 指定语言环境的月份简称 Feb(英文)、二月(中文)
%tB 指定语言环境的月份全称 February(英文)、二月(中文)
%ta 指定语言环境的星期简称 Mon(英文)、星期一(中文)
%tA 指定语言环境的星期全称 Monday(星期一)、星期一(中文)
%tc 包括全部日期和时间信息 星期六 六月 10 09:10:20 CST 2023=======================================================================================================================
示例
class test {public static void main(String[] args) {Date date = new Date();//初始化一个时间日期对象,使用无参构造函数表示获取的是当前系统时间//获取年、月、日、周String year = String.format("%tY", date);String month = String.format("%tb", date);String day = String.format("%te", date);String week = String.format("%tA", date);//输入结果System.out.println("今天是" + year + "年" + month + day + "日");System.out.println("今天是:" + week);}
}//运行结果
今天是2023年七月12日
今天是:星期三
3.1.2、时间格式化
常用的时间格式转换符
===================================================================================
转换符 说明 示例
-----------------------------------------------------------------------------------
%tH 2位数字的24时制的小时(00~23) 13
%tI 2位数字的12时制的小时(00~23) 01
%tM 2位数字的分钟(00~59) 05
%tS 2位数字的秒数(00~60) 12
%tL 3位数字的毫秒(000~999) 666
%tp 指定语言环境下的上午或下午标记 下午(中文)、pm(英文)
%tZ 时区缩写形式的字符串 CST
===================================================================================
示例
class test {public static void main(String[] args) {Date date = new Date();String hour = String.format("%tH", date);String minute = String.format("%tM", date);String second = String.format("%tS", date);System.out.println("现在是:" + hour + "点" + minute + "分" + second + "秒");String hour2 = String.format("%tI", date);String pm = String.format("%tp", date);System.out.println("现在是:" + pm + hour2 + "点" + minute + "分" + second + "秒");}
}//运行结果
现在是:10点27分17秒
现在是:上午10点27分17秒
3.1.3、常见的日期和时间组合的格式
===============================================================
转换符 说明 示例
---------------------------------------------------------------
%tF "年-月-日"格式 2021-05-09
%tD "月/日/年"格式 05/09/2021
%tT "时:分:秒" 24时制 08:20:42
%tR "时:分" 24时制 08:20
===============================================================
示例
class test {public static void main(String[] args) {Date date = new Date();String time = String.format("%tc", date);String form = String.format("%tF", date);String form2 = String.format("%tD", date);String form3 = String.format("%tr", date);String form4 = String.format("%tT", date);String form5 = String.format("%tR", date);System.out.println("完整的时间信息是:" + time);System.out.println("年-月-日格式:" + form);System.out.println("年/月/日格式:" + form2);System.out.println("时:分:秒 PM(AM)格式:" + form3);System.out.println("时:分:秒格式:" + form4);System.out.println("时:分格式:" + form5);}
}//运行结果
完整的时间信息是:星期三 七月 12 10:30:57 CST 2023
年-月-日格式:2023-07-12
年/月/日格式:07/12/23
时:分:秒 PM(AM)格式:10:30:57 上午
时:分:秒格式:10:30:57
时:分格式:10:30
3.2、DateFormat
class test {public static void main(String[] args) {SimpleDateFormat sdf1 = new SimpleDateFormat("yy年MM月dd日");SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");SimpleDateFormat sdf5 = new SimpleDateFormat("今年已经过了DDD天,快w个星期,现在是这个月的第W个星期");SimpleDateFormat sdf6 = new SimpleDateFormat("现在是E");String date1 = sdf1.format(new Date());String date2 = sdf2.format(new Date());String date3 = sdf3.format(new Date());String date4 = sdf4.format(new Date());String date5 = sdf5.format(new Date());String date6 = sdf6.format(new Date());System.out.println(date1);System.out.println(date2);System.out.println(date3);System.out.println(date4);System.out.println(date5);System.out.println(date6);}
}//运行结果
23年07月12日
2023年07月12日
2023年07月12日 10时33分
2023年07月12日 10时33分23秒
今年已经过了193天,快28个星期,现在是这个月的第3个星期
现在是星期三
3.3、SimpleDateFormat 类
3.3.1、SimpleDateFormat 类基本构造方法:
SimpleDateFormat 类是DateFormat 类的一个子类。
new SimpleDateFormat();默认模式和默认日期格式符号创造。
SimpleDateFormat(String pattern);使用指定的模式和默认日期格式符号创造。
SimpleDateFormat(String pattern, Locale locale);使用指定的模式和指定语言环境的默认日期符号构造。
代表日期和时间的模式元素字母:
====================================================================================================================
字母 含义 示例
--------------------------------------------------------------------------------------------------------------------
y 年, 一个y代表一位 "yyy"代表019,"yyyy"代表2019
M 月份 例如八月,M代表8,MM代表08
w 一年中的第几周 常用ww表示
W 一个月中的第几周 常用WW表示
d 一个月中的第几天 常用dd表示
D 一年中的第几天 常用DDD表示
E 星期几,用E表示星期,根据不同语言环境返回 CHINA表示星期几,US表示英文缩写
a 上午或下午 am代表上午,pm代表下午
H 一天中的小时数,二十四小时制 常用HH表示
h 一天中的小时数,十二小时制 常用hh表示
m 分钟数 常用mm表示
s 秒数 常用ss表示
S 毫秒数 常用SSS表示
====================================================================================================================
示例
class test {public static void main(String[] args) {SimpleDateFormat myFmt=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");SimpleDateFormat myFmt1=new SimpleDateFormat("yy/MM/dd HH:mm");SimpleDateFormat myFmt2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等价于now.toLocaleString()SimpleDateFormat myFmt3=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");SimpleDateFormat myFmt4=new SimpleDateFormat("一年中的第 D 天 一年中第w个星期 一月中第W个星期 在一天中k时 z时区");Date now=new Date(); // 现在的日期// 按照自定义的时间编排格式 输出时间System.out.println(myFmt.format(now));System.out.println(myFmt1.format(now));System.out.println(myFmt2.format(now));System.out.println(myFmt3.format(now));System.out.println(myFmt4.format(now));System.out.println(now.toGMTString());System.out.println(now.toLocaleString());System.out.println(now.toString());}
}//运行结果
2023年07月12日 10时38分56秒
23/07/12 10:38
2023-07-12 10:38:56
2023年07月12日 10时38分56秒 星期三
一年中的第 193 天 一年中第28个星期 一月中第3个星期 在一天中10时 CST时区
12 Jul 2023 02:38:56 GMT
2023-7-12 10:38:56
Wed Jul 12 10:38:56 CST 2023
四、Calendar 类
打开Java API 文档可以看到java.util.Date 类提供的大部分方法都已经过时了,因为 Date 类在设计之初没有考虑到国际化,而且很多方法也不能满足用户需求,比如需要获取指定时间的年月日时分秒信息,或者想要对日期时间进行加减运算等复杂的操作,Date 类已经不能胜任,因此JDK 提供了新的时间处理类——Calendar 日历类。
4.1、初始化一个Calendar 对象
class test {public static void main(String[] args) {//方式1Calendar calendar1 = Calendar.getInstance();//方式2Calendar calendar2 = new GregorianCalendar();}
}
4.2、Calendar类中的常用字段
==================================================================================================
字段名 说明
--------------------------------------------------------------------------------------------------
DAY_OF_YEAR 一年中的第几天
DAY_OF_MONTH 一个月中的第几天
DAY_OF_WEEK 一个星期中的第几天YEAR 年份
MONTH 月份
DATE 日(一个月中的第几天)
HOUR 12小时制的小时
HOUR_OF_DAY 24小时制的小时
MINUTE 分钟
SECOND 秒
MILLISECOND 毫秒WEEK_OF_YEAR 当前年中的第几个星期
WEEK_OF_MONTH 当前月中的第几个星期,日历式的第几周。(例如今天是2023年7-12,是7月的第3周)
DAY_OF_WEEK_IN_MONTH 当前月中的第几个星期,按这个月1号算,1号起就是第1周,8号起就是第2周。===================================================================================================
示例
class test {public static void main(String[] args) {// 创建Calendar对象Calendar cal = Calendar.getInstance();System.out.println("当前时间: " + cal.getTime());/* 时间的获取 */int year = cal.get(Calendar.YEAR); // 年份int month = cal.get(Calendar.MONTH) + 1; // 月份(月份0代表1月)int date = cal.get(Calendar.DATE); // 日期,年月日中的日,同DAY_OF_MONTHint week_of_year = cal.get(Calendar.WEEK_OF_YEAR); // 第几个星期/年int week_of_month = cal.get(Calendar.WEEK_OF_MONTH); // 第几个星期/月int day_of_week_in_month = cal.get(Calendar.DAY_OF_WEEK_IN_MONTH); // 第几个星期/月int day_of_year = cal.get(Calendar.DAY_OF_YEAR); // 第几天/年int day_of_month = cal.get(Calendar.DAY_OF_MONTH); // 第几天/月int day_of_week = cal.get(Calendar.DAY_OF_WEEK); // 第几天/星期int hour = cal.get(Calendar.HOUR); // 小时,12小时制int hour_of_day = cal.get(Calendar.HOUR_OF_DAY); // 小时,24小时制int minute = cal.get(Calendar.MINUTE); // 分钟int second = cal.get(Calendar.SECOND); // 秒int millisecond = cal.get(Calendar.MILLISECOND); // 毫秒//输出System.out.println("年份,YEAR: " + year);System.out.println("月份,MONTH: " + month);System.out.println("日期,DATE: " + date);System.out.println("第几个星期/年,WEEK_OF_YEAR: " + week_of_year);System.out.println("第几个星期/月,WEEK_OF_MONTH: " + week_of_month);System.out.println("第几个星期/月,DAY_OF_WEEK_IN_MONTH: " +day_of_week_in_month);System.out.println("第几天/年,DAY_OF_YEAR: " + day_of_year);System.out.println("第几天/月,DAY_OF_MONTH: " + day_of_month);System.out.println("第几天/星期,DAY_OF_WEEK: " + day_of_week);System.out.println("小时,12小时制,HOUR: " + hour);System.out.println("小时,24小时制,HOUR_OF_DAY: " + hour_of_day);System.out.println("分钟,MINUTE: " + minute);System.out.println("秒,SECOND: " + second);System.out.println("毫秒,MILLISECOND: " + millisecond);}
}//运行结果
当前时间: Wed Jul 12 15:33:06 CST 2023
年份,YEAR: 2023
月份,MONTH: 7
日期,DATE: 12
第几个星期/年,WEEK_OF_YEAR: 28
第几个星期/月,WEEK_OF_MONTH: 3
第几个星期/月,DAY_OF_WEEK_IN_MONTH: 2
第几天/年,DAY_OF_YEAR: 193
第几天/月,DAY_OF_MONTH: 12
第几天/星期,DAY_OF_WEEK: 4
小时,12小时制,HOUR: 3
小时,24小时制,HOUR_OF_DAY: 15
分钟,MINUTE: 33
秒,SECOND: 6
毫秒,MILLISECOND: 20
标题
=======================================================================================================================方法 说明
-----------------------------------------------------------------------------------------------------------------------
add(int field. int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量
after(Object when) 判断此 Calendar 对象表示的时间是否在指定 Obiect 表示的时间之后,返回判断结果
before(Object when) 判断此 Calendar 对象表示的时间是否在指定 Object 表示的时间之前,返回判断结果
get(int field) 返回给定日历字段的值
getInstance() 使用默认时区和语言环境获得一个日历
getTime() 返回一个表示此 Calendar 对象时间值(从历元至现在的毫秒偏移量)的 Date 对象
getTimeInMillis() 返回此 Calendar 对象的时间值,以毫秒为单位
roll(int field boolean up) 在给定的时间字段上添加或减去 (上/下) 单个时间单元,不更改更大的字段
set(int field. int value) 将给定的日历字段设置为给定值
set(int year, int month, int date) 设置日历字段YEAR、MONTH 和 DAY OF MONTH 的值
set(int year,int month, int date, inthourOfDay, int minute) 设置日历字段 YEAR、MONTH、DAY OF MONTH、HOUR OF DAY 和MINUTE的值
set(int year. int month. int date. inthourOfDay, int minute, int second) 设置字段 YEAR、MONTH、DAY OF MONTH、HOUR、MINUTE 和 SECOND的值
setTime(Date date) 使用给定的 Date 对象设置此 Calendar 对象的时间
setTimeInMillis(long millis) 用给定的 long 值设置此 Calendar 对象的当前时间值
=======================================================================================================================
示例
class test {public static void main(String[] args) {System.out.println("——————————共和国建立100周年倒计时——————————");Date date = new Date(); // 当前时间// 创建SimpleDateFormat对象,指定目标格式SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");// 调用format方法,格式化时间,转换为指定方法String today = simpleDateFormat.format(date);System.out.println("今天是" + today); // 输出当前日期// 获取自1970年1月1日至当前时间所经过的毫秒数long time1 = date.getTime();// 使用默认时区和语言环境获得一个日历calendarCalendar calendar = Calendar.getInstance();// 设置日历calendar中的 年、月 和日的值。因为月份是从0开始计算的,所以这里要减一calendar.set(2049, 10 - 1, 1);// 计算自1970年1月1日至2049年10月1日所经过的毫秒数long time2 = calendar.getTimeInMillis();// 计算2049年10月1日距离当前时间相差的天数long day = (time2 - time1) / (1000 * 60 * 60 * 24);System.out.println("距离2049年10月1日还有 " + day + " 天!");}
}//运行结果
——————————共和国建立100周年倒计时——————————
今天是2023年07月12日
距离2049年10月1日还有 9578 天!