在应用程序设计中,我们经常会用到日期时间,比如出生日期之类的,JAVA中为我们提供了一些处理日期的类。这一片博客将为大家介绍一下。
Date类是我们用的比较多的一个处理时间的类。表示特定的瞬间,精确到毫秒。
在 JDK 1.1 之前,类 Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃。 在类 Date 所有可以接受或返回年、月、日期、小时、分钟和秒值的方法中,将使用下面的表示形式:
在所有情形中,针对这些目的赋予方法的参数不需要在指定的范围内;例如,可以把日期指定为 1 月 32 日,并把它解释为 2 月 1 日的相同含义。
下表中展示的为Date类的构造方法,已经过时的方法没有列出:
方法名 | 说明 |
---|---|
Date() | 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒) |
Date(long date) | 分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数 |
返回值 | 方法名 | 说明 |
---|---|---|
boolean | after(Date when) | 测试此日期是否在指定日期之后 |
boolean | before(Date when) | 测试此日期是否在指定日期之前 |
Object | clone() | 返回此对象的副本 |
int | compareTo(Date anotherDate) | 比较两个日期的顺序 |
boolean | equals(Object obj) | 比较两个日期的相等性 |
long | getTime() | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 |
int | hashCode() | 返回此对象的哈希码值 |
void | setTime(long time) | 设置此 Date 对象,以表示 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) |
import java.util.Date;
public class DateDemo
{
public static void main(String[] args)
{
// 获得当前时间
Date now = new Date();
// 表示的毫秒数
long time = now.getTime();
// 创建一个过去的时间
Date before = new Date(time - 1000);
// 创建一个未来的时间
Date after = new Date(time + 1000);
// 时间比较
System.out.println(now.after(before));
System.out.println(now.before(after));
}
}
输出结果为:
true
true
Date类可以很方便的表示时间,但是诸如获得当前小时、分钟等方法已经被标记为过时的方法。所以这里为大家介绍Calendar类。
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化: Calendar rightNow = Calendar.getInstance();
Calendar 对象能够生成为特定语言和日历风格实现日期-时间格式化所需的所有日历字段值,例如,日语-格里高里历,日语-传统日历。Calendar 定义了某些日历字段返回值的范围,以及这些值的含义。
YEAR + MONTH + DAY_OF_MONTH
YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
YEAR + DAY_OF_YEAR
YEAR + DAY_OF_WEEK + WEEK_OF_YEAR
HOUR_OF_DAY
AM_PM + HOUR
注: 对于某些特别时间的解释可能会有某些歧义,可以用下列方式解决:
23:59 是一天中的最后一分钟,而 00:00 是下一天的第一分钟。因此,1999 年 12 月 31 日的 23:59 < 2000 年 1 月 1 日的 00:00。
尽管从历史上看不够精确,但午夜也属于 “am”,,中午属于 “pm”,所以在同一天,12:00 am ( 午夜 ) < 12:01 am,12:00 pm ( 中午 ) < 12:01 pm。
日期或时间格式字符串不是日历定义的一部分,因为在运行时,用户必须能够修改或重写它们。可以使用 DateFormat 格式化日期。
方法名 | 说明 |
---|---|
protected Calendar() | 构造一个带有默认时区和语言环境的 Calendar |
protected Calendar(TimeZone zone, Locale aLocale) | 构造一个带有指定时区和语言环境的 Calendar |
返回值 | 方法名 | 说明 |
---|---|---|
abstract void | add(int field, int amount) | 根据日历的规则,为给定的日历字段添加或减去指定的时间量 |
boolean | after(Object when) | 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果 |
boolean | before(Object when) | 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果 |
void | clear() | 将此 Calendar 的所日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义 |
void | clear(int field) | 将此 Calendar 的给定日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义 |
Object | clone() | 创建并返回此对象的一个副本 |
int | compareTo(Calendar anotherCalendar) | 比较两个 Calendar 对象表示的时间值(从历元至现在的毫秒偏移量) |
protected void | complete() | 填充日历字段中所有未设置的字段 |
protected abstract void | computeFields() | 将当前毫秒时间值 time 转换为 fields[] 中的日历字段值 |
protected abstract void | computeTime() | 将 fields[] 中的当前日历字段值转换为毫秒时间值 time |
boolean | equals(Object obj) | 将此 Calendar 与指定 Object 比较 |
int | get(int field) | 返回给定日历字段的值 |
int | getActualMaximum(int field) | 给定此 Calendar 的时间值,返回指定日历字段可能拥有的最大值 |
int | getActualMinimum(int field) | 给定此 Calendar 的时间值,返回指定日历字段可能拥有的最小值 |
static Locale[] | getAvailableLocales() | 返回所有语言环境的数组,此类的 getInstance 方法可以为其返回本地化的实例 |
String | getDisplayName(int field, int style, Locale locale) | 返回给定style和locale下的日历field值的字符串表示形式 |
Map< String, Integer> | getDisplayNames(int field, int style, Locale locale) | 返回给定style和locale下包含日历 field 所有名称的Map及其相应字段值 |
int | getFirstDayOfWeek() | 获取一星期的第一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY |
abstract int | getGreatestMinimum(int field) | 返回此 Calendar 实例给定日历字段的最高的最小值 |
static Calendar | getInstance() | 使用默认时区和语言环境获得一个日历 |
static Calendar | getInstance(Locale aLocale) | 使用默认时区和指定语言环境获得一个日历 |
static Calendar | getInstance(TimeZone zone) | 使用指定时区和默认语言环境获得一个日历 |
static Calendar | getInstance(TimeZone zone, Locale aLocale) | 使用指定时区和语言环境获得一个日历 |
abstract int | getLeastMaximum(int field) | 返回此 Calendar 实例给定日历字段的最低的最大值 |
abstract int | getMaximum(int field) | 返回此 Calendar 实例给定日历字段的最大值 |
int | getMinimalDaysInFirstWeek() | 获取一年中第一个星期所需的最少天数,例如,如果定义第一个星期包含一年第一个月的第一天,则此方法将返回 1 |
abstract int | getMinimum(int field) | 返回此 Calendar 实例给定日历字段的最小值 |
Date | getTime() | 返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象 |
long | getTimeInMillis() | 返回此 Calendar 的时间值,以毫秒为单位 |
TimeZone | getTimeZone() | 获得时区 |
int | hashCode() | 返回该此日历的哈希码 |
protected int | internalGet(int field) | 返回给定日历字段的值 |
boolean | isLenient() | 判断日期/时间的解释是否为宽松的 |
boolean | isSet(int field) | 确定给定日历字段是否已经设置了一个值,其中包括因为调用 get 方法触发内部字段计算而导致已经设置该值的情况 |
abstract void | roll(int field, boolean up) | 在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段 |
void | roll(int field, int amount) | 向指定日历字段添加指定(有符号的)时间量,不更改更大的字段 |
void | set(int field, int value) | 将给定的日历字段设置为给定值 |
void | set(int year, int month, int date) | 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值 |
void | set(int year, int month, int date, int hourOfDay, int minute) | 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值 |
void | set(int year, int month, int date, int hourOfDay, int minute, int second) | 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值 |
void | setFirstDayOfWeek(int value) | 设置一星期的第一天是哪一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY |
void | setLenient(boolean lenient) | 指定日期/时间解释是否是宽松的 |
void | setMinimalDaysInFirstWeek(int value) | 设置一年中第一个星期所需的最少天数,例如,如果定义第一个星期包含一年第一个月的第一天,则使用值 1 调用此方法 |
void | setTime(Date date) | 使用给定的 Date 设置此 Calendar 的时间 |
void | setTimeInMillis(long millis) | 用给定的 long 值设置此 Calendar 的当前时间值 |
void | setTimeZone(TimeZone value) | 使用给定的时区值来设置时区 |
String | toString() | 返回此日历的字符串表示形式 |
import java.util.Calendar;
public class CalendarDemo
{
public static void main(String[] args)
{
// 获得当前时间
Calendar now = Calendar.getInstance();
System.out.println("年:" + now.get(Calendar.YEAR));
System.out.println("月:" + now.get(Calendar.MONTH));
System.out.println("日:" + now.get(Calendar.DAY_OF_MONTH));
System.out.println("时:" + now.get(Calendar.HOUR_OF_DAY));
System.out.println("分:" + now.get(Calendar.MINUTE));
System.out.println("秒:" + now.get(Calendar.SECOND));
System.out.println("豪秒:" + now.get(Calendar.MILLISECOND));
System.out.println("星期:" + now.get(Calendar.DAY_OF_WEEK));
}
}