日期时间类
Date类
注:以下介绍的Date都在java.util包下,除此之外,java.sql包下也有此类,不要混淆
构造方法
-
Date():分配Date对象并初始化此对象,以表示分配他的时间(精确到毫秒)
-
Date(long date):分配Date对象并初始化此对象,以表示自标准基准时间(即1970年1月1日00:00:00GMT)起指定毫秒数Date后的时间
使用第二种构造方法要先创建一个Date对象
//在此之前要导入Date类
import java.util.Date;
long t=System.currentTimeMillis();
Date date = new Date(t);
注:使用Date对象用的是long
Date类的常用方法和说明
方法 | 说明 |
---|---|
after(Date when) | 测试当前日期是否在指定日期之后 |
before(Date when) | 测试当前日期是否在指定日期之前 |
getTime() | 获得自1970年1月1日00:00:00GMT起到现在所经过的毫秒数 |
setTime(long time) | 设置当前Date对象所表示的日期时间值,该值用以表示1970年1月1日00:00:00GMT以后time毫秒的时间点 |
获取当前日期和时间
import java.util.Date;
public static void main(String[] args) {
Date date = new Date();
long value= date.getTime();//获得毫秒数
System.out.println("日期:"+date);
System.out.println("到现在所经历的毫秒数是:"+value);
}
/*
日期:Sat Sep 04 18:44:19 CST 2021
到现在所经历的毫秒数是:1630752259575
*/
日期时间格式化(DateFormat类)
格式化风格有以下4种
(以2021年9月2日举例)
SHORT:完全为数字
MEDIUM:较长
LONG:更长
FULL:完全指定
要格式化日期,首先要创建DateFormat对象,因为他是抽象类,所以可以用getDateInstance()进行创建
DateFormat d=DateFormat.getDateInstance();
此类常用方法和说明
方法 | 说明 |
---|---|
format() | 将一个Date对象实例格式化为日期/时间字符串 |
getCalendar() | 获取于此日期/时间格式器关联的日历 |
getDateInstance() | 获取日期格式器,该格式器具有默认语言环境的默认格式化风格 |
getDateTimeInstance() | 获取日期/时间格式器,该格式器具有默认语言环境的默认格式化风格 |
getInstance() | 获取为日期和时间使用SHORT风格的默认日期/时间格式器 |
getTimeInstance() | 获取时间格式器,该格式器具有默认语言环境的默认格式化风格 |
parse(String source) | 将字符串解析成一个日期,并返回这个日期的Date对象 |
实例如下
import java.text.DateFormat;
import java.util.Date;
public static void main(String[] args) {
//将当前日期按照默认模式输出
DateFormat d1=DateFormat.getInstance();
System.out.println(d1.format(new Date()));
//21-9-6 下午4:40
//输出长类型格式的当前时间
DateFormat d2=DateFormat.getTimeInstance(DateFormat.LONG);
System.out.println(d2.format(new Date()));
//下午04时40分48秒
//输出长类型格式的当前日期
DateFormat d3=DateFormat.getDateInstance(DateFormat.LONG);
System.out.println(d3.format(new Date()));
//2021年9月6日
//输出长类型格式的当前时间和日期
DateFormat d4=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
System.out.println(d4.format(new Date()));
//2021年9月6日 下午04时40分48秒
}
因为DateFormat是一个抽象类,所以,除了使用getXXXInstance()方法创建对象,还可以用其子类,例如SimpleDateFormat类,此类提供了19个格式化字符,可以让开发者随意编写日期格式
SimpleDateFormat类提供的格式化字符
字母 | 日期或时间元素 | 类型 | 示例 |
---|---|---|---|
G | Era标识志符 | Text | AD |
y | 年 | Year | 2021;21 |
M | 年中的月份 | Month | July;Jul;07 |
w | 年中的周数 | Number | 22 |
W | 月份中的周数 | Number | 3 |
D | 年中的天数 | Number | 56 |
d | 月份中的天数 | Number | 15 |
F | 月份中的星期 | Number | 3 |
E | 星期中的天数 | Text | Monday;Mon |
a | Am/pm标记 | Text | PM |
H | 一天中的小时数(0~23) | Number | 11 |
h | am/pm中的小时数(1~12) | Number | 2 |
k | 一天中的小时数(1~24) | Number | 22 |
K | am/pm中的小时数(0~11) | Number | 10 |
m | 小时中的分钟数 | Number | 35 |
s | 分钟中的秒数 | Number | 50 |
S | 毫秒数 | Number | 555 |
z | 时区 | General time zone | Pacific Standard Time;PST;GMT-08:00 |
Z | 时区 | RFC 822 time zone | -800 |
一般表中字母的数量会影响数字的格式,例如yyyy表示4位年份:2021,yy表示2位年份:21,y表示4位年份,如果超过4个y,则在左侧补0,yyyyyy表示002021
常用时间格式
日期时间 | 对应的格式 |
---|---|
2021/9/6 | yyyy/MM/dd |
2021.9.6 | yyyy.MM.dd |
2021-09-06 17:42:50 | yyyy-MM-dd HH.mm.ss |
2021年9月6日 17时46分50秒 | yyyy年MM月dd日 HH时mm分ss秒 |
下午5时 | ah时 |
今年已经过去了200天 | 今年已经过去了D天 |
示例如下
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public static void main(String[] args) {
DateFormat d = new SimpleDateFormat("yyyy年MM月dd日 EEEE HH时mm分ss秒");
System.out.println("现在是:");
System.out.println(d.format(new Date()));
//2021年09月06日 星期一 17时51分17秒
}
Calendar类
Date在设计时并没有考虑国际化,所以之中的方法并不能满足当下需求,所以就有了Calendar类的出现,也是一个抽象类,该类提供了一些字段和方法,这些字段和方法被定义为protected。
该类提供了一个getIntance()方法,以获得此类型的一个通用对象。Calendar类的getIntance()方法返回一个Calendar类对象,其日历字段已由当前日期和时间初始化
import java.util.Calendar;
Calendar a=Calendar.getInstance();
此类提供的常用字段及其说明
字段名 | 说明 |
---|---|
DATE | 指示一个月中的某天 |
DAY_OF_MONTH | 指示一个月中的某天 |
DAY_OF_WEEK | 指示一个星期的某天 |
DAY_OF_WEEK_IN_MONTH | 指示当前月中的第几个星期 |
DAY_OF_YEAR | 指示当前年中的天数 |
HOUR | 指示上午或下午的小时 |
HOUR_OF_DAY | 指示一天中的小时 |
MILLISECOND | 指示一秒中的毫秒 |
MINUTE | 指示一小时的分钟 |
MONTH | 指示月份 |
SECOND | 指示一分钟的秒 |
time | 日历的当前设置时间,以毫秒为单位,表示自格林威治标准时间1970年1月1日0:00:00后经过的时间 |
WEEK_OF_MONTH | 指示当前月中的星期数 |
WEEK_OF_YEAR | 指示当前年中的星期数 |
YEAR | 指示年 |
此类提供的常用方法和说明
方法 | 说明 |
---|---|
add() | 根据日历规则,为给定的日历字段添加或减去指定的时间量 |
after() | 判断此Calendar对象表示的时间是否在指定Object表示的时间之后,返回判断结果 |
before() | 判断此Calendar对象表示的时间是否在指定Object表示的时间之前,返回判断结果 |
get() | 返回给定日历字段的值 |
getInstance() | 使用默认时区和语言环境获得一个日历 |
getTime() | 返回一个表示此判断此Calendar对象时间值(从历元至现在的时间偏移量)的Date对象 |
getTimeInMillis() | 返回此判断此Calendar对象的时间值,以毫秒为单位 |
roll() | 在给定的日历时间段上添加或减去(上/下)单个时间单位,不更改更大的字段 |
set(int field,int value) | 将给定的日历字段设置为给定值 |
set(int year,int month,int date) | 设置日历字段YEAR,MONTH和DAY_OF_MONTH的值 |
set(int year,int month,int date,int hourOfDay,int minute) | 设置日历字段YEAR,MONTH,DAY_OF_MONTH,HOUR_OF_DAY和MINUTE的值 |
set(int year,int month,int date,int hourOfDay,int minute,int second) | 设置日历字段YEAR,MONTH,DAY_OF_MONTH,HOUR,MINUTE和SECOND的值 |
setTime() | 使用给定的Date对象设置此Calendar对象的值 |
setTimeInMillis() | 用给定的long值设置此Calendar对象的当前时间值 |
今天离*成立100周年差多少天
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public static void main(String[] args) {
System.out.println("----------*100周年倒计时----------");
Date date = new Date();
//创建SDF对象,设置日期格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
//调用format方法,格式化时间并转换为目标格式
String today=simpleDateFormat.format(date);
System.out.println("今天是"+today);//输出当前日期
//获取从1970年1月1日至当前所经历的毫秒数
long time1= date.getTime();
//使用默认时区和语言环境获得一个日历
Calendar calendar=Calendar.getInstance();
//设置日历中的年月日的值,因为月份是从0开始的,所以要减1
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+"天");
}
注:
- c.(Calendar.DAY_OF_MONTH,0)获取的是上个月的最后一天,所以调用前需要将月份往后加一个月
- Calendar.MONTH的第一个月是从0开始记录的,所以在获得月份数字后要加1。年和日是从1记录的,不用加1
- Calendar.DAY-OF_WEEK的第一天是周日,第二天是周一,最后一天是周六
关于setTime
import java.util.Date;
Date date = new Date();
date.setTime(10000);//10000毫秒等于10秒
System.out.println(date);
//输出Thu Jan 01 08:00:10 CST 1970
setTime(t)指的是经过从1970年1月1日8点开始经过t毫秒后的时间