Java 时间和日期
1 Date类
1.1 Date类概述
Date类的大部分方法已经过时了,但是也有一些没有过时的方法。Date类实现时间戳与时间对象的转换,时间戳在日期和时间的计算方面有很重要的意义,因为它是long类型的数。
TestDemo.java
public class TestDemo{
public static void main(String[] args){
/*
时间和日期Date类引包 java.util.Date
毫秒概念:1000ms = 1s
System.currentTimeMillis()返回值long类型数值
时间原点:公元1970年1月1日,午夜00:00:00 毫秒值为0
重要:时间和日期的计算,必须依赖毫秒值
xxxx-xx-xx = 毫秒
*/
long time = System.currentTimeMillis();
System.out.println(time);
}
}
运行结果
类 Date 表示特定的瞬间,精确到毫秒。Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象。
TestDemo.java
import java.util.Date;
public class TestDemo{
public static void main(String[] args){
/*
Date类的空参构造方法
默认表示当前时间的毫秒值
返回Date对象
*/
Date date = new Date();
System.out.println(date);
/*
Date类的long参数的构造方法
Date(long)
long表示毫秒值
返回Date对象
*/
long l = 0L;
Date date1 = new Date(l);
System.out.println(date1);
}
}
运行结果
1.2 Date类常用方法
TestDemo.java
import java.util.Date;
public class TestDemo{
public static void main(String[] args){
/*
Date类方法getTime() 返回long 毫秒值
将Date表示的日期,转成毫秒值
*/
Date date1 = new Date();
long time1 = date1.getTime();
System.out.println(time1);
/*
Date类方法setTime方法
将long毫秒值转换成日期对象
Date的构造方法也能完成这个功能
*/
Date date2 = new Date();
long time = 1530846211513L;
date2.setTime(time);
System.out.println(date2);
}
}
2 DateFormat类
2.1 DateFormat类概述
DateFormat 是日期/时间格式化子类的抽象类(DateFormat不能直接创建对象,要调用它的方法可以创建子类对象),它以与语言无关的方式格式化并解析日期或时间。
日期/时间格式化子类(如 SimpleDateFormat类)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。
通过SimpleDateFormat类可以帮我们完成日期和文本之间的转换。
2.2 日期格式
要格式化一个当前语言环境下的日期也就是(日期 -->文本),要通过下面的方法来完成。DateFormat是抽象类,我们需要使用其子类SimpleDateFormat来创建对象。
构造方法
DateFormat类方法
TestDemo.java
import java.util.Date;
import java.text.SimpleDateFormat;
public class TestDemo{
public static void main(String[] args){
/*
对日期进行格式化(自定义)
对日期格式化类java.text.DateFormat抽象类,它有普通方法,也有抽象方法
实际是使用子类java.text.SimpleDateFormat,他是普通类
*/
/*
如何对日期格式化
步骤:
1、创建SimpleDateFormat对象
在类构建方法中,写入字符串的日期格式(自定义)
2、SimpleDateFormat调用方法format对日期进行格式化
String format(Date date) 传递日期对象
日期模式:
yyyy —— 年份
MM —— 月份
dd —— 天数
HH —— 小时
mm —— 分钟
ss —— 秒数
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
String s = sdf.format(new Date()); //传入匿名对象
System.out.println(s);
}
}
运行结果
DateFormat类的作用:即可以将一个Date对象转换为一个符合指定格式的字符串,也可以将一个符合指定格式的字符串转为一个Date对象。
指定格式的具体规则我们可参照SimpleDateFormat类的说明,这里做简单介绍,规则是在一个字符串中,会将以下字母替换成对应时间组成部分,剩余内容原样输出:
当出现y时,会将y替换成年
当出现M时,会将M替换成月
当出现d时,会将d替换成日
当出现H时,会将H替换成时
当出现m时,会将m替换成分
当出现s时,会将s替换成秒
2.3 DateFormat类常用方法
image.png format方法,用来将Date对象转换成String
parse方法,用来将String转换成Date(转换时,该String要符合指定格式,否则不能转换)。
TestDemo.java
import java.util.Date;
import java.text.SimpleDateFormat;
public class TestDemo{
public static void main(String[] args) throws Exception{
/*
DateFormat类方法parse
将字符串解析为时间对象
Date parse(String s) 将字符串变成日期对象
String ==》Date
*/
/*
步骤:
1、创建SimpleDateFormat对象
在类构建方法中,写入字符串的日期格式(自定义)
2、SimpleDateFormat调用方法parse
传递字符串,返回Date
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("1995-09-01");
System.out.println(date);
}
}
3 Calendar类
3.1 Calendar类概念
Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。
Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,将语言敏感内容处理好,再返回子类对象,如下:
Calendar类静态方法
代码演示TestDemo.java
import java.util.Calendar;
public class TestDemo{
public static void main(String[] args) throws Exception{
/*
日历类java.util.Calendar,他是抽象类,必须使用他的子类对象
Calendar类写了静态方法getInstance(),直接返回子类对象
不需要直接new子类对象,通过静态方法直接获取
*/
Calendar c = Calendar.getInstance(); //多态
System.out.println(c);
}
}
运行结果
4.2 Calendar类常用方法
演示代码TestDemo.java
import java.util.Calendar;
import java.util.Date;
public class TestDemo{
public static void main(String[] args) throws Exception{
/*
Calendar类的get(int v)方法,获取时间字段值
获取相关字段的值
YEAR 年
MONTH 月,从0开始算起,最大11;0代表1月,11代表12月。
DATE 天
HOUR 时
MINUTE分
SECOND秒
*/
Calendar c = Calendar.getInstance(); //多态
printCalendar(c);
/*
Calendar类的set方法,设置日历指定字段的值
set(int field,int value)
field 设置的是哪个日历字段
value 设置后的具体数值
set(int year,int month,int day)
*/
//方法一
Calendar c1 = Calendar.getInstance(); //多态
c1.set(Calendar.YEAR, 2020);
c1.set(Calendar.MONTH, 4);
c1.set(Calendar.DATE, 20);
printCalendar(c1);
//方法二
Calendar c2 = Calendar.getInstance();
//设置时间为2020年5月20日
c2.set(1990,11,30);
printCalendar(c2);
/*
Calendar类的add方法,指定字段增加某值
日历的偏移量,可以指定一个日历中的字段,进行整数的偏移
add(int field,int value)
*/
Calendar c3 = Calendar.getInstance();
//修改当前时间为3天后
c3.add(Calendar.DAY_OF_MONTH, 3);
//修改当前时间为5小时后
c3.add(Calendar.HOUR, 5);
printCalendar(c3);
//获取该日历对象转成的日期对象
//用法不多
Calendar c4 = Calendar.getInstance();
Date date = c4.getTime();
}
public static void printCalendar(Calendar c){
//获取年份
int year = c.get(Calendar.YEAR);
//获取月份
int month =c.get(Calendar.MONTH)+1;
//获取天数(月份中的天数)
int day =c.get(Calendar.DAY_OF_MONTH);
//获取小时
int hour =c.get(Calendar.HOUR_OF_DAY);
//获取分钟
int minute =c.get(Calendar.MINUTE);
//获取秒
int second =c.get(Calendar.SECOND);
//打印年月日
System.out.println(year+"年"+month+"月"+day+"日 "+hour+"时"+minute+"分"+second+"秒");
}
}
运行结果
3.3 注意事项
西方星期的开始为周日,中国为周一。
在Calendar类中,月份的表示是以0-11代表1-12月。
日期是有大小关系的,时间靠后,时间越大。
4 日期相关类练习
4.1 求出自己已经出生多少天
思路:
1.获取当前时间的时间戳
2.获取自己出生日期对应的时间戳
3.两个时间相减
代码实现:
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestDemo{
public static void main(String[] args) throws Exception{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dstr="2000-08-08 00:08:08 ";
Date date=sdf.parse(dstr);
long s1=date.getTime();//将时间转为毫秒
long s2=System.currentTimeMillis();//得到当前的毫秒
int day=(int)((s2-s1)/1000L/60L/60L/24L);
System.out.println("距现在已有"+day+"天,你得抓紧时间学习了" );
}
}