Java学习之七 Java日期时间(Date类 Calendar 类 GergorianCalendar类)
Java日期时间
Date 类 Calendar 类 GergorianCalendar类
Java.util包包含用来封装当前日期与时间的Date类。该类有两个用于创建Date对象的构造函数。
- Date()(基于当前日期与时间来初始化对象)
- Date(long millisec)(接受一个参数:指定的时间点):该参数是从公历元年一月一日零时起计算的毫秒值
Date对象创建之后,常用的方法如下:
Date对象方法
| 方法 | 描述 |
|---|---|
| boolean after(Date date) | 若当调用此方法的Date对象在指定日期之后返回true,否则返回false |
| boolean before(Date date) | 若当调用此方法的Date对象在指定日期之前返回true,否则返回false |
| Object clone( ) | 返回此对象的副本 |
| int compareTo(Date date) | 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数 |
| int compareTo(Object obj) | 若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException |
| boolean equals(Object date) | 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false |
| long getTime( ) | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 |
| int hashCode( ) | 返回此对象的哈希码值 |
| void setTime(long time) | 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期 |
| String toString( ) | 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat) |
日期比较
通过上述方法,可以通过以下三种方法来比较日期:
- 通过getTime()函数提取两个日期(基于1970年1月1日的标准时间值)进行比较。
- 采用before和after的方法调用等于号进行比较。
- 采用compareTo方法;而Date类继承了Comparable接口。
SimpleDateFormat格式化日期
SimplificationDate是一个根据语言环境自动调整以格式化和分析日期的类,并支持任意自定义的日期和时间格式。
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
Date dNow = new Date( );//当前日期
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");//定义格式化
System.out.println("当前时间为: " + ft.format(dNow));//格式化显示
}
}
显示结果为:2019-05-06 10:19:16
yyyy代表完整的公历年份;MM表示月份;dd对应日期;HH采用的是24小时制的时间表示方法;而hh则采用12小时制;mm代表分钟的时间单位;ss则是表示秒数的时间单位
使用Printf格式化日期
使用两个字母格式,它以%t开头并且以下面表格中的一个字母结尾。
| 转换符 | 说明 | 示例 |
|---|---|---|
| c | 包括全部日期和时间信息 | 星期六 十月 27 14:21:20 CST 2007 |
| F | "年-月-日"格式 | 2007-10-27 |
| D | "月/日/年"格式 | 10/27/07 |
| r | "HH:MM:SS PM"格式(12时制) | 02:25:51 下午 |
| T | "HH:MM:SS"格式(24时制) | 14:28:16 |
| R | "HH:MM"格式(24时制) | 14:28 |
当频繁地引用date时,则可以借助一个格式化的字符串来明确指示需要明确标识的参数位置。
- 索引必须紧跟在%后面,而且必须以$结束
System.out.printf("%1s %2tB %2td, %2tY", "Due date:", date) 使用toString()显示日期和时间
- 或使用<标志,表明先前被格式化的参数要被再次使用
System.out.printf("%s %tB %<te, %<tY", "Due date:", date);// 显示格式化时间
- 定义日期格式的转换符可以使日期通过指定的转换符生成新字符串
| 字符 | 描述 | 例子 |
|---|---|---|
| b | 月份的简称 | String str=String.format(Locale.US,"英文月份简称:%tb",date)//May System.out.printf("本地月份简称:%tb%n",date);//五月 |
| B | 月份的全称 | //May //五月 |
| a | 星期的简称 | Mon 星期一 |
| A | 星期的全称 | Monday 星期一 |
| C | 年的前两位数字(不足两位前面补0) | 20 |
| y | 年的后两位数字(不足两位前面补0) | 19 |
| j | 一年中的天数(即年的第几天) | 126 |
| m | 两位数字的月份(不足两位前面补0) | 05 |
| d | 两位数字的日(不足两位前面补0) | 06 |
| e | 日(一位不补零) | 6 |
import java.util.*;
public class DateDemo{
public static void main(String[] args)
{
Date date= new Date();
//b,月份的简称
String str1 = String.format(Locale.US,"英文月份的简称:%tb",date);
System.out.println(str1);
System.out.printf("本地月份的简称:%tb%n",date);
//B月份的全称
String str2 = String.format(Locale.US,"英文月份的全称:%tB",date);
System.out.println(str2);
System.out.printf("本地月份的简称:%tB%n",date);
//a,星期的简称
String str3 = String.format(Locale.US,"英文星期的简称:%ta",date);
System.out.println(str3);
System.out.printf("本地星期的简称:%tb%n",date);
//A,星期的全称
String str4 = String.format(Locale.US,"英文星期的全称:%tA",date);
System.out.println(str4);
System.out.printf("本地星期的简称:%tA%n",date);
//C,年的前两位
System.out.printf("年的前两位数字(不足两位前面补0):%tC%n",date);
//y,年的后两位
System.out.printf("年的后两位数字(不足两位前面补0):%ty%n",date);
//j,一年的天数
System.out.printf("一年中的天数(即年的第几天):%tj%n",date);
//m,月份
System.out.printf("两位数字的月份(不足两位前面补0):%tm%n",date);
//d,日(二位,不够补零)
System.out.printf("两位数字的日(不足两位前面补0):%td%n",date);
//e的使用,日(一位不补零)
System.out.printf("月份的日(前面不补0):%te%n",date);
}
}

解析字符串为时间
SimpleDateFormat类包含一些额外的方法,尤其是有一个名为parse()的方法。这个方法旨在通过分析指定的日期格式化存储内容来解码输入字符串。
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");
String input="2019-05-06";
Date t = ft.parse(input);
Calendar类
比Date类功能强大,实现也复杂一些。
Calender类是抽象类
- 创建一个代表系统当前日期的Calendar对象
Calendar c = Calendar.getInstance();//默认是当前日期
- 创建一个指定日期的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);//2019-6-12
Calendar 类对象字段类型
| 常量 | 描述 |
|---|---|
| Calendar.YEAR | 年份 |
| Calendar.MONTH | 月份 |
| Calendar.DATE | 日期 |
| Calendar.DAY_OF_MONTH | 日期,和上面的字段意义完全相同 |
| Calendar.HOUR | 12小时制的小时 |
| Calendar.HOUR_OF_DAY | 24小时制的小时 |
| Calendar.MINUTE | 分钟 |
| Calendar.SECOND | 秒 |
| Calendar.DAY_OF_WEEK | 星期几 |
GregorianCalendar类
Calendar类遵循公历规则,并实现了日历功能;其中 GregorianCalendar 作为 Calendar 类的具体实例遵循 Greg 公历算法。
getInstance()方法会提供一个基于现时语言环境与时区配置的默认GregorianCalendar实例。该类包含两个字段,分别以AD与BC表示。这些字段标志了公历的不同时代。
GregorianCalendar对象的构造方法
| 构造函数及说明 |
|---|
| GregorianCalendar() 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar |
| GregorianCalendar(int year, int month, int date) 在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar |
| GregorianCalendar(int year, int month, int date, int hour, int minute) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar |
| GregorianCalendar(int year, int month, int date, int hour, int minute, int second) 为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar |
| GregorianCalendar(Locale aLocale) 在具有给定语言环境的默认时区内构造一个基于当前时间的 GregorianCalendar |
| GregorianCalendar(TimeZone zone) 在具有默认语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar |
| GregorianCalendar(TimeZone zone, Locale aLocale) 在具有给定语言环境的给定时区内构造一个基于当前时间的 GregorianCalendar |
GregorianCalendar 类提供的方法
| 函数及说明 |
|---|
| void add(int field, int amount) 根据日历规则,将指定的(有符号的)时间量添加到给定的日历字段中 |
| protected void computeFields() 转换UTC毫秒值为时间域值 |
| protected void computeTime() 覆盖Calendar ,转换时间域值为UTC毫秒值 |
| boolean equals(Object obj) 比较此 GregorianCalendar 与指定的 Object |
| int get(int field) 获取指定字段的时间值 |
| int getActualMaximum(int field) 返回当前日期,给定字段的最大值 |
| int getActualMinimum(int field) 返回当前日期,给定字段的最小值 |
| int getGreatestMinimum(int field) 返回此 GregorianCalendar 实例给定日历字段的最高的最小值 |
| Date getGregorianChange() 获得格里高利历的更改日期 |
| int getLeastMaximum(int field) 返回此 GregorianCalendar 实例给定日历字段的最低的最大值 |
| int getMaximum(int field) 返回此 GregorianCalendar 实例的给定日历字段的最大值 |
| Date getTime() 获取日历当前时间 |
| long getTimeInMillis() 获取用长整型表示的日历的当前时间 |
| TimeZone getTimeZone() 获取时区 |
| int getMinimum(int field) 返回给定字段的最小值 |
| int hashCode() 重写hashCode |
| boolean isLeapYear(int year) 确定给定的年份是否为闰年 |
| void roll(int field, boolean up) 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段 |
| void set(int field, int value) 用给定的值设置时间字段 |
| void set(int year, int month, int date) 设置年、月、日的值 |
| void set(int year, int month, int date, int hour, int minute) 设置年、月、日、小时、分钟的值 |
| void set(int year, int month, int date, int hour, int minute, int second) 设置年、月、日、小时、分钟、秒的值 |
| void setGregorianChange(Date date) 设置 GregorianCalendar 的更改日期 |
| void setTime(Date date) 用给定的日期设置Calendar的当前时间 |
| void setTimeInMillis(long millis) 用给定的long型毫秒数设置Calendar的当前时间 |
| void setTimeZone(TimeZone value) 用给定时区值设置当前时区 |
| String toString() 返回代表日历的字符串 |
说明:Calender的月份是从0开始的,日期与年份是从1开始的
日期为0 上个月的最后一天
月份的规则与日期一致
年份设为非负数的时候,会自动变为绝对值+1
