Java日期:Date、Calendar及DateFormat格式化
显示、记录日期在开发中非常常见,Java提供了基础的日期类Date。
1、Date
1.1、Date构造函数
①默认构造函数:默认当前时间作为参数,调用第②个构造函数。
public Date() {
this(System.currentTimeMillis());
}②以计算机“时间远点”的起始毫秒数作为参数。
/**
*分配一个Date对象,并将其初始化为表示自标准基准时间(即“纪元”)(即GMT 1970年1月1日)以来指定的毫秒数。
*/
public Date(long date) {
fastTime = date;
}③年/月/日 已废弃
/**
* @param year 减去1900年。
* @param month 0-11之间的月份。
* @param date 一个月中的天数,在1-31之间.
* @deprecated As of JDK version 1.1,
*/
@Deprecated
public Date(int year, int month, int date) {
this(year, month, date, 0, 0, 0);
}④年/月/日/时/分 已废弃
/**
* @param year the year minus 1900.
* @param month the month between 0-11.
* @param date the day of the month between 1-31.
* @param hrs the hours between 0-23.
* @param min the minutes between 0-59.
* @deprecated As of JDK version 1.1,
*/
@Deprecated
public Date(int year, int month, int date, int hrs, int min) {
this(year, month, date, hrs, min, 0);
}⑤年/月/日/时/分/秒 已废弃
public Date(int year, int month, int date, int hrs, int min, int sec);⑥字符串形式表示日期 已废弃
@Deprecated
public Date(String s) {
this(parse(s));
}1.2、Date常用方法
Date日期类提供了丰富的方法获取年、月、日、时、分等日期。
①long getTime():返回自格林尼治标准时间1970年1月1日00:00:00以来的毫秒数
public long getTime() {
return getTimeImpl();
}②getYear():获取年份 -1900
③getMonth():获取月份 0~11
④getDate():获取一个月中的第几天 1~31
⑤getDay():获取一周中的第几天 0~6
⑥getHours():获取小时 0~23
⑦getMinutes():获取分钟 0~59
⑧getSeconds():获取秒数 0~59
2、Calendar
Calendar类的实现比Date类要复杂,功能要比Date类强大很多,可以方便的进行日期的计算,获取日期中的信息时考虑了时区等问题。
2.1、获取Calendar对象
Calendar类是抽象类(它的实现类是GregorianCalendar),且Calendar类的构造方法是protected,无法使用Calendar类的构造方法来创建对象,好在Java提供了几种getInstance方法用来创建对象。默认返回的Calender都是当前日期。
①getInstance()
public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}②getInstance(TimeZone zone)
public static Calendar getInstance(TimeZone zone)
{
return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
}③getInstance(Locale aLocale)
public static Calendar getInstance(Locale aLocale)
{
return createCalendar(TimeZone.getDefault(), aLocale);
}④getInstance(TimeZone zone,Locale aLocale)
public static Calendar getInstance(TimeZone zone,Locale aLocale)
{
return createCalendar(zone, aLocale);
}这几个方法都是调用内部的私有静态方法createCalendar(TimeZone zone,Locale aLocale)返回GregorianCalendar对象。
private static Calendar createCalendar(TimeZone zone,Locale aLocale){
// BEGIN Android-changed: only support GregorianCalendar here
return new GregorianCalendar(zone, aLocale);
// END Android-changed: only support GregorianCalendar here
}2.2、Calendar中的字段
Calendar类中用一下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想。
//年份
Calendar.YEAR
//月份
Calendar.MONTH
//日期
Calendar.DATE
//日期,和上面的字段意义相同
Calendar.DAY_OF_MONTH
//12小时制的小时
Calendar.HOUR
//24小时制的小时
Calendar.HOUR_OF_DAY
//分钟
Calendar.MINUTE
//秒
Calendar.SECOND
//星期几
Calendar.DAY_OF_WEEK2.3、Calendar中的方法
设置set、获取get等方法操作、获取Calendar日期信息。
2.3.1、set方法
①set(int field, int value) 设置指定字段对应的值
public void set(int field, int value)
{
// If the fields are partially normalized, calculate all the
// fields before changing any fields.
if (areFieldsSet && !areAllFieldsSet) {
computeFields();
}
internalSet(field, value);
isTimeSet = false;
areFieldsSet = false;
isSet[field] = true;
stamp[field] = nextStamp++;
if (nextStamp == Integer.MAX_VALUE) {
adjustStamp();
}
}②set(int year, int month, int date):设置Calendar的年月日,内部也是分别调用上面的方法实现的。
public final void set(int year, int month, int date)
{
set(YEAR, year);
set(MONTH, month);
set(DATE, date);
}③set(int year, int month, int date, int hourOfDay, int minute):同上
④set(int year, int month, int date, int hourOfDay, int minute,int second):同上
2.3.2、get方法
返回给定日历字段的值。 在宽大模式下,所有日历字段均已标准化。 在非宽容模式下,将验证所有日历字段,并且如果任何日历字段的值超出范围,则此方法将引发异常。 归一化和验证由{@link #complete()}方法处理,该过程为日历。
①getTime():返回当前时间的Date对象
public final Date getTime() {
return new Date(getTimeInMillis());
}②get(int field):获取指定时间域的值
public int get(int field)
{
complete();
return internalGet(field);
}例:
// 获得年份
int year = calendar.get(Calendar.YEAR);2.3.3、add方法
对Calendar中指定的时间域进行计算。
abstract public void add(int field, int amount);在Calendar中是抽象方法,在它的实现类GregorianCalendar中实现该方法(实现有点复杂,就不贴代码了)。
例:
//把calendar对象的日期加上8,也就是calendar所表的日期的8天后的日期,其它所有的数值会被重新计算
calendar.add(Calendar.DATE, 8);3、DateFormat
DateFormat是日期/时间格式化子类的抽象类,该子类以与语言无关的方式格式化和解析日期或时间。它的实现类是SimpleDateFormat。通常用来完成时间的指定格式化转换。
3.1、Date->String
将Date格式化成指定样式的String
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
String dateStr=sdf.format(new Date());
//输出2020-05-123.1、String->Date
将String解析成指定日期格式
String str="2020-5-12";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Date birthday = sdf.parse(str);参考资料:

