Java日期时间
Date 类 Calendar 类 GergorianCalendar类
Java.uitl包提供了Date类来封装当前的日期和时间。Date类提供两个构造函数来实例化Date对象。
- Date(),使用当前日期和时间来初始化对象
- Date(long millisec),接收一个参数,该参数是从1970年1月1日起的毫秒数
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().equals()方法比较
- 使用compareTo()方法,它是由Comparable接口定义的,Date类实现了这个接口
SimpleDateFormat格式化日期
SimpleDateFormat是一个以语言环境敏感的方式来格式化和分析日期的类,允许你选择任何用户自定义日期时间格式运行。
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("%1$s %2$tB %2$td, %2$tY", "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 对象的格式化存储来解析字符串
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类的一个具体实现。
Calendar 的getInstance()方法返回一个默认用当前的语言环境和时区初始化的GregorianCalendar对象。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