日期类 Date SimpleDateFormat Calendar
Java中的时间
Java中的时间有三种表现形式:Long、Date、Calendar。
所有的系统时间都是由一个相对固定时间点作为时间原点作为时间坐标量的起始位置。
该固定时间点叫做纪元(epoch),是UTC时间1970年1月1日 00:00:00。
UTC(Universal Time Coordinated 世界调整时间)与我们通常所说的GMT(Greenwich Mean Time 格林尼治时间)一样是一种具有实际目的的科学标准时间。
Long类型存储的时间信息是当前时间点距离时间原点(1970年1月1日 00:00:00)的毫秒值
Date是在Long型存储的时间量的基础上计算到具体的时间量,问题:时区问题,千年虫问题
Date(java.util.Date)
Date类因为存在设计缺陷(时区、千年虫),导致目前Date中大多时操作时间的方法已经被设置为过时方法
目前Date类更多时候已经被当做一个时间的存储类来使用。Date中剩余的方法如下
继承自Object类中的方法:hashCode()/equals()/clone()
//默认的创建Date类对象表示当前系统时间 Date date = new Date(); /* * Date类中重写了toString()方法 * 输出格式对非英语地区用户不太友好 */ System.out.println(date); //output:Tue Nov 01 11:00:35 GMT+08:00 2016 /* * 因为默认date对象存储的时对象创建时毫秒时 * 所以date与date02的存储时间明显不相等 */ Date date02 = new Date(); System.out.println(date.equals(date02)); //output:false
继承自Comparable接口的compateTo(),该方法用于比较两个Date对象表示的时间前后关系,不过在Date类中有更加直观的after() & before()方法可以实现比较两个Date对象。
/* * int compateTo(Date date); * 返回0代表时间相同,返回正数代表时间较晚,返回负数代表时间叫早 */ int k = date.compareTo(date02); System.out.println(k); //output:-1,date比date02小(早)
long型时间值与Date型时间对象的互换方法:getTime()/setTime()
/* * long getTime(Date date); * 将Date对象转换为long值返回 * void setTime(long l) * 设置当前Date对象的时间点 * / long time = date.getTime(); Date date2 = new Date(); date2.setTime((time+1000*60*60*24)); System.out.println(date2); /* * output: * Tue Nov 01 18:49:01 GMT+08:00 2016 * Wed Nov 02 18:49:01 GMT+08:00 2016 */
两个时间的比较方法:after()/before()
System.out.println(date.after(date2)); //output: false System.out.println(date.before(date2)); //output: true
SimpleDateFormat
java.text.SimpleDateFormat
SimpleDateFormat是一个展示时间对象的辅助类,它不支持对时间对象进行改动和操作。
但是它也是我们系统中有关时间对象的最重要的类。
因为它涉及到将时间对象转换为可见的、易读的特定格式的String类型对象,同时也满足将输入的String类型对象按照指定格式读取为对应的时间对象
在设计对象指定格式时,不同的字母都对应着不同的含义如下
字符 | 象征 | 使用范例 | 返回范例 |
---|---|---|---|
y | 年 | yyyy年 | 2016年 |
M | 月 | MM月 | 11月 |
d | 日 | dd日 | 01日 |
E | 星期 | E | 星期一 |
a | 上下午 | a | 下午(PM) |
H | 24时制 | HH | 19 |
h | 12时制 | hh | 12 |
m | 分 | mm | 08 |
s | 秒 | dd | 23 |
1. 构造方法
可以使用默认构造SimpleDateFormat()来构造一个SimpleDateFormat对象,只需在之后使用指定方法给对象指定读取和返回的时间格式即可
但更多的我们是使用有参构造SimpleDateFormat(String pattern)来创建一个对象,该构造方法在初始化时便可以指定SimpleDateFormat对象对Date的读取返回格式。
SimpleDateFormat sdf = new SimpleDateFormat();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
设置和查看指定字符串格式方法
- void applyPattern(String pattern)
设置当前SimpleDateFormat对象的指定字符串格式 String toPattern()
返回当前SimpleDateFormat对象的指定字符串格式sdf.applyPattern(“yyyy/MM/dd HH:mm:ss”);
sdf.toPattren(); // output: yyyy/MM/dd HH:mm:ss
- void applyPattern(String pattern)
Date对象转换为String对象
String format(Date date);
将Date对象转换为指定格式的String对象返回
format:格式,使格式化~Date date = new Date(); String today = sdf.format(date); System.out.println(today); //output 2016/11/01 19:13:22
String对象转换为Date对象
Date parse(String time) throw ParseException
将字符串对象按照指定格式读取成Date型格式对象,因为读入的String类型有格式指定,因此若是有不合格式要求的String对象读入方法将会抛出ParseException异常
parse:解析,从语法上解释
其他有parse词根的方法用法也类似的有:Integer Integer.parseInt(String str)/Double Double.parseDouble(String str)String time = "2008/08/08 20:08:08"; try { Date day = sdf.parse(time); } catch(ParseException e) { System.out.println(Date); //outprint: Fri Aug 08 20:08:08 GMT+08:00 2008 }
Calendar
java.util.Calendar
Calendar抽象类用于封装日期信息和日期操作的类,是Java对Date类的强化和取代。它完全满足与Date时间类对象的互换。
它的主要作用在于它的方法可以对时间分量进行修改和计算。
Calendar作为抽象类,它的子类分别对应了不同国家的日历系统,
另外Calendar抽象类也重写了toString()
方法,但是重写后的输出格式十分难读。
Calendar对象的初始化
因为Calendar属于抽象类因此我们无法使用一般类对象的声明方式即new ClassName()
来创建一个Calendar实现类对象。
在使用Calendar抽象类时,我们一般都是用方法getInstance()
来获取一个对应时区和语言环境的一个Calendar实现类对象。
事实上我们获取的当然不可能时一个完全意义上Calendar对象,而是在调用getInstance
方式时,在方法的内部帮我们创建了一个实现了Calendar抽象类的子类对象。返回时将该子类对象但是向上造型为引用为Calendar类型的对象。//创建默认的Calendar实现类来表示当前的系统时间 Calendar cal = Calendar.getInstance();
Calendar实现类对象与其他时间表示方法的互换
除了使用getInstance
方法来创建一个默认时间与时区的Calendar实现类对象外,我们还可以对已经创建的对象时间进行设置
同时我们也可以从Calendar实现类对象中获取的时间,返回Date or long形式void setTIme(Date date)
将指定date对象表示的时间设置为当前对象的时间void setTimeInMillis(long mills)
将给定毫秒值表示的时间设置为当前对象的时间Date getTime();
以Date形式返回当前Calendar实现类对象表示的时间long getTimeInMillis();
以long形式获取当前Calendar实现类对象表示的当前时间量的毫秒值.Date today = cal.getTime(); long millis = cal.getTimeInMillis(); System.out.println(today); //output: Tue Nov 01 20:02:35 GMT+08:00 2016 System.out.println(millis); //output: 1478001755719 millis += 1000*60*60*24; //时间加一天 today.setTime(millis); cal.setTime(today); Calendar cal02 = Calendar.getInstance(); cal02.setTimeInMillis(millis); System.out.println(cal.equals(cal02)); //output: true
获取Calendar实现类中的指定时间分量对应的值
int get(int field)
使用该方法可以获取field所指定的对应的值。时间分量field是一个int值,并不需要我们记住具体数字,因为所有需要使用的时间分量都已经在Calendar抽象类中被包装成了静态常量,只要使用即可。比如
Calendar.YEAR 指定年的数字字段
Calendar.MONTH 指定月的数字字段
Calendar.DATE 指定一个月中的某天
~~
注意在使用Calendar.DAY_OF_WEEK(一周中的某天)时需要知道,国外一般一周的第一天是周日,因此如果此时返回1则代表的是:周日
int year = cal.get(Calendar.YEAR); //output: 2016
设置当前Calendar实现类对象的指定分量值
void set(int field)
我们可以使用方法set()
对当前对象中的某个时间分量进行设置,此处使用时间分量field与get()
方法中的时间分量使用方法一致,也是代表着一个int值。cal.set(Calendar.YEAR, 2008); int year = cal.get(Calendar.YEAR); System.out.println(year); // 2008
获取时间分量的最大值
int getActualMaximum(int field)
使用上述方法getActualMaximum()
可以获取当前时间分量的最大值,此处使用时间分量field与get()
方法中的时间分量使用方法一致,也是代表着一个int值。int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); System.out.println(days); //output: 30
计算时间的方法
void add(int field,int value)
对当前对象的指定分量值进行改变,改变的方式是在当前分量值的基础上做加法。若是给定的时负值,则做的是减法。/* * 查看4年零3个月25天以后是哪天 */ cal.add(Calendar.YEAR,4); cal.add(Calendar.MONTH, 3); cal.add(Calendar.DAY_OF_YEAR, 25); System.out.println(cal.getTime()); //output: Fri Feb 26 20:31:02 GMT+08:00 2021