概述
日期时间在计算机里用一个长整型数字表示,为时间戳,单位为毫秒,时间每过一毫秒,数字加一 时间原点为0,对应日期为1970-01-01 08:00:00 (8点是因为中国的太平洋时区是UTC-8,刚好和格林威治时间差8个小时) 1969年发布了第一个 UNIX版本:AT&T,综合考虑,当时就把1970年当做了时间原点。
常用日期类
表示日期时间的常用类有:Date、Calendar、LocalDateTime(等)
Date是最早的日期时间类,大部分方法已过时。
Calendar是日历类,除可以获取设置时间日期外,还支持做简单的日期和时间运算的功能。
LocalDateTime等是jdk1.8添加的一系列用于处理日期时间的类型
注:是java.util.Date 类,java.sql.Date类是用于数据库的 日期类
Date
Date类中的大多数方法都标注了@Deprecated 表示其已过时,在未来的某个版本中可能会被删除。
为数不多的未被标记弃用的方法有:
boolean after = date1.after(new Date()); //date1是否在某时间之后
boolean before =date1.before(new Date()); //date1是否在某时间之前
long time = date1.getTime(); //获取时间毫秒数与 System.currentTimeMillis()相同
date1.setTime(1000); //设置时间
Instant instant = date1.toInstant(); //获取java8的时间日期api中的时间戳对象
Date类的常用方法如下:
public static void main(String[] args) {
Date date1 = new Date(); // 无参构造创建的为当前时间的日期对象
System.out.println("当前时间:" + date1); // 输出为:当前时间:Sun Mar 01 21:55:31 CST 2020
System.out.println("=====================================================");
Date date2 = new Date(60 * 60 * 1000L); // 可以使用含long类型参数的构造器创建日期对象,此时的时间为从1970-01-01 08:00:00起经过了1小时
System.out.println("时间原点经过一小时:" + date2); // 时间原点经过一小时:Thu Jan 01 09:00:00 CST 1970
System.out.println("----------------------------------------------------");
//常用
System.out.println(date1.after(new Date())); // false
System.out.println(date1.before(new Date())); // true
System.out.println(date1.getTime()); //获取时间毫秒
Instant instant = date1.toInstant();// 获取java8的时间日期api的时间戳对象 可用于与calendar和localdatetime转换
System.out.println(instant.toEpochMilli() + "毫秒");
System.out.println(instant.getEpochSecond() + "秒");
//其他方法
System.out.println("年:"+(date1.getYear()+1900));//获得年份要加1900
System.out.println("月:"+(date1.getMonth()+1)); //获得值为0~11,代表1~12月
System.out.println("日:"+date1.getDate()); //1~31
System.out.println(date1.toGMTString());
System.out.println(date1.toLocaleString());
//设置时间为
date1.setTime(1000);
System.out.println(date1); // Thu Jan 01 08:00:01 CST 1970
long currentTimeMillis = System.currentTimeMillis();// 获取当前日期的毫秒数,与new Date().getTime()一样
System.out.println(currentTimeMillis);//
System.out.println("==========================================================");
注:getYear()的值要+1900才正确;getMonth()值为0-11表示1-12月
日期格式化
当直接使用toString方法输出Date字符串时,格式为Thu Jan 01 08:00:01 CST 1970,并不是我们常用的表示方法,难以辨别,这时可以用SimpleDateFormat.format方法格式化日期对象为我们想要的形式。在创建SimpleDateFormat对象时传入模式串。
yyyy 代表年
MM 代表月
dd 代表日
HH 代表24进制的小时
hh 代表12进制的小时
mm 代表分钟
ss 代表秒
SS 代表毫秒
格式通常为:yyyy-MM-dd HH:mm:ss 分隔符( - :)可以改变
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(new Date());
System.out.println("格式化后的时间为:"+format);//格式化后的时间为:2020-03-03 14:25:51
解析表示日期时间的字符串:
当需要将一个时间字符串转换成日期对象时,可以使用SimpleDateFormat.parse(String)方法,但要注意时间字符串的格式要与模式串的格式相同,否则会抛出异常ParseException,如果为2020/03/03 14:25:51就会抛异常
try {
Date parse = simpleDateFormat.parse("2020-03-03 14:25:51");
System.out.println(parse);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Calendar
Calendar是单例的,采用单例模式获取日历对象Calendar.getInstance();
获取的Calendar对象默认表示的是当前时间。
在Calendar类中定义了一些字段,可用于获取、设置年/月/日/时/分/秒/毫秒
Calendar.YEAR 年
Calendar.MONTH 月
Calendar.DATE 日
Calendar.DAY_OF_MONTH
Calendar.DAY_OF_WEEK 星期
Calendar.HOUR 时
Calendar.MINUTE 分
Calendar.SECOND 秒
Calendar.MILLISECOND 毫秒
…
注:MONTH的范围为0-11表示1-12月;DAY_OF_WEEK的范围为1-7表示周日-周六;所以它俩在使用时可以一个加一,一个减一。
基本使用方法:
- 获取时间
get方法:获取年、月、日等值
Calendar c = Calendar.getInstance();
System.out.println("year:"+c.get(Calendar.YEAR));
System.out.println(c.get(Calendar.MONTH)); //和Date一样,获取的月值为0~11
System.out.println(c.get(Calendar.DATE));
System.out.println(c.get(Calendar.DAY_OF_MONTH)); //
System.out.println("星期"+c.get(Calendar.DAY_OF_WEEK)); //1~7对应周日~周六
System.out.println(c.get(Calendar.HOUR));
System.out.println(c.get(Calendar.MINUTE));
System.out.println(c.get(Calendar.SECOND));
System.out.println(c.get(Calendar.MILLISECOND));
- 设置时间
add方法:以当前Calendar对象表示的时间为基准修改日期时间,方法第一个参数为要操作的值(年、月、日、时、分、秒、毫秒),第二个参数为增加(正值)或减少(负值)的大小
set方法:直接设置年/月/日等,第一个参数同上,第二个参数为直接设置的值,如果超出范围则对高位进位或借位,如2020-12 设置(MONTH,12)/(MONTH,-1) 超出范围,结果为2021-01/2019-12
c.add(Calendar.MONTH, -1);
c.add(Calendar.YEAR, 2);
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime()));
c.set(Calendar.DATE, 3); //直接设置年/月/日等
c.set(Calendar.MONTH, 1); //因为月为0~11,所以这里实际设置的为2月
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime()));
c.set(Calendar.MONTH, 0);
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime()));
- 格式化
Calendar没有自己的格式化方法,需使用getTime()方法获取Date对象,再通过SimpleDateFormat去进行格式化。
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(c.getTime()));
jdk1.8日期时间API
待完善。。。。。。