Java日期时间实用工具类
Java日期时间实用工具类
1.Date (java.util.Date)
Date();
以当前时间构造一个Date对象
Date(long);
构造函数
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 至今的毫秒数
void setTime(long time)
按time的指定,设置时间和日期,表示自 1970 年 1 月 1 日 00:00:00 GMT 至今的以毫秒为单位的时间值
2.Calendar 类是一个抽象类. 日历瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量.
Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();
Calendar 定义了某些日历字段返回值的范围,以及这些值的含义。例如,对于所有日历,日历系统第一个月的值是 MONTH == JANUARY。
public void set(int f, int value);
将日历字段 f 更改为 value. 此外, 它设置了一个内部成员变量, 以指示日历字段 f 已经被更改.
尽管日历字段 f 是立即更改的, 但是直到下次调用 get()、getTime()、getTimeInMillis()、add() 或 roll() 时才会重新计算日历的时间值(以毫秒为单位).
public void add(int f, int delta);
将 delta 添加到 f 字段中。这等同于调用 set(f, get(f) + delta), 溢出发生在字段值超出其范围时,下一个更大的字段会递增或递减,并将字段值调整回其范围内;
与 set() 不同,add() 强迫日历系统立即重新计算日历的毫秒数和所有字段.
如,要从当前日历时间减去 5 天,可以通过调用以下方法做到这一点: add(Calendar.DAY_OF_MONTH, -5)。
public void roll(int f, int delta);
将 delta 添加到 f 字段中, 但不更改更大的字段.
public static Calendar getInstance()
使用默认时区和语言环境获得一个日历。返回的 Calendar 基于当前时间,使用了默认时区和默认语言环境。
public static Calendar getInstance(TimeZone zone)
使用指定时区和默认语言环境获得一个日历。返回的 Calendar 基于当前时间,使用了给定时区和默认语言环境。
public static Calendar getInstance(Locale aLocale)
使用默认时区和指定语言环境获得一个日历。返回的 Calendar 基于当前时间,使用了默认时区和给定的语言环境。 aLocale - 用于星期数据的语言环境
public static Calendar getInstance(TimeZone zone, Locale aLocale)
使用指定时区和语言环境获得一个日历。返回的 Calendar 基于当前时间,使用了给定的时区和给定的语言环境。
zone - 要使用的时区
aLocale - 用于星期数据的语言环境
public static Locale[] getAvailableLocales()
返回所有语言环境的数组,此类的 getInstance 方法可以为其返回本地化的实例。返回的数组必须至少包含一个 Locale 实例,它等同 Locale.US。
语言环境的数组,对于该数组,本地化的 Calendar 实例是可用的。
public final Date getTime()
返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。
public final void setTime(Date date)
使用给定的 Date 设置此 Calendar 的时间。
注:使用 Date(Long.MAX_VALUE) 或 Date(Long.MIN_VALUE) 调用 setTime() 可能产生来自 get() 的错误字段值。
date - 给定的 Date。
public long getTimeInMillis()
返回此 Calendar 的时间值,以毫秒为单位。
返回:当前时间,以从历元至现在所经过的 UTC 毫秒数形式。
public void setTimeInMillis(long millis)
用给定的 long 值设置此 Calendar 的当前时间值。
public int get(int field)
返回给定日历字段的值
public final void set(int year, int month, int date)
设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。保留其他日历字段以前的值。如果不需要这样做,则先调用 clear()。
参数:year - 用来设置 YEAR 日历字段的值。
month - 用来设置 MONTH 日历字段的值。Month 值是基于 0 的。例如,0 表示 January。
date - 用来设置 DAY_OF_MONTH 日历字段的值。
public final void set(int year, int month, int date, int hourOfDay, int minute)
设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。保留其他字段以前的值。如果不需要这样做,则先调用 clear()。
参数:year - 用来设置 YEAR 日历字段的值。
month - 用来设置 MONTH 日历字段的值。Month 值是基于 0 的。例如,0 表示 January。
date - 用来设置 DAY_OF_MONTH 日历字段的值。
hourOfDay - 用来设置 HOUR_OF_DAY 日历字段的值。
minute - 用来设置 MINUTE 日历字段的值。
public final void set(int year, int month, int date, int hourOfDay, int minute, int second)
设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。保留其他字段以前的值。如果不需要这样做,则先调用 clear()。
参数:year - 用来设置 YEAR 日历字段的值。
month - 用来设置 MONTH 日历字段的值。Month 值是基于 0 的。例如,0 表示 January。
date - 用来设置 DAY_OF_MONTH 日历字段的值。
hourOfDay - 用来设置 HOUR_OF_DAY 日历字段的值。
minute - 用来设置 MINUTE 日历字段的值。
second - 用来设置 SECOND 日历字段的值。
public final boolean isSet(int field)
确定给定日历字段是否已经设置了一个值,其中包括因为调用 get 方法触发内部字段计算而导致已经设置该值的情况。
返回:如果给定日历字段已经设置了一个值,则返回 true;否则返回 false。
public boolean before(Object when)
判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。此方法等效于: compareTo(when) < 0
public boolean after(Object when)
判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。此方法等效于: compareTo(when) > 0
public int compareTo(Calendar anotherCalendar)
比较两个 Calendar 对象表示的时间值(从历元至现在的毫秒偏移量)。
public abstract void roll(int field, boolean up)
在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。例如,要将当前日期向上滚动一天,可以通过调用以下方法做到这一点: roll(Calendar.DATE, true)。
public void setTimeZone(TimeZone value)
使用给定的时区值来设置时区。
public TimeZone getTimeZone()
获得时区。
public void setLenient(boolean lenient)
指定日期/时间解释是否是宽松的。
对于宽松的解释,可以将诸如 "February 942, 1996" 之类的日期视为等同于 1996 年 1 月 1 日后的第 941 天。而对于严格的(non-lenient)解释,这样的日期会导致抛出异常。默认情况下是宽松的。
public boolean isLenient()
判断日期/时间的解释是否为宽松的。
public void setFirstDayOfWeek(int value)
设置一星期的第一天是哪一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY。
public int getFirstDayOfWeek()
获取一星期的第一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY。
3.DateFormat
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间.
日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化.
将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年 1 月 1 日 00:00:00 这一刻开始的毫秒数.
DateFormat 提供了很多类方法,
public static final DateFormat getInstance()
public static final DateFormat getTimeInstance()
public static final DateFormat getTimeInstance(int style)
public static final DateFormat getTimeInstance(int style, Locale aLocale)
public static final DateFormat getDateInstance()
public static final DateFormat getDateInstance(int style)
public static final DateFormat getDateInstance(int style, Locale aLocale)
public static final DateFormat getDateTimeInstance()
public static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle)
public static final DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale)
以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间 Formatter。
格式化风格(style参数)包括 FULL、LONG、MEDIUM 和 SHORT, 不带参数的版本使用 SHORT 格式的默认语言环境的默认格式化风格的格式器.
public final String format(Date date)
将一个 Date 格式化为日期/时间字符串
public Date parse(String source) throws ParseException
从给定字符串的开始解析文本,以生成一个日期。该方法不使用给定字符串的整个文本。
4.SimpleDateFormat
SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类.
SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。
(1)日期和时间模式
日期和时间格式由日期和时间模式字符串指定。
在日期和时间模式字符串中,未加引号的字母 A-Z和a-z 被解释为模式字母,用来表示日期或时间字符串元素。
文本可以使用单引号 (') 引起来,以免进行解释。
所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。
定义了以下模式字母(所有其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保留):
G -- Era 标志符 -- Text -- AD
y -- 年 -- Year -- 1996; 96
M -- 年中的月份 -- Month -- July; Jul; 07
w -- 年中的周数 -- Number -- 27
W -- 月份中的周数 -- Number -- 2
D -- 年中的天数 -- Number -- 189
d -- 月份中的天数 -- Number -- 10
F -- 月份中的星期 -- Number -- 2
E -- 星期中的天数 -- Text -- Tuesday; Tue
a -- Am/pm 标记 -- Text -- PM
H -- 一天中的小时数(0-23) -- Number -- 0
k -- 一天中的小时数(1-24) -- Number -- 24
K -- am/pm 中的小时数(0-11) -- Number -- 0
h -- am/pm 中的小时数(1-12) -- Number -- 12
m -- 小时中的分钟数 -- Number -- 30
s -- 分钟中的秒数 -- Number -- 55
S -- 毫秒数 -- Number -- 978
z -- 时区 -- General time zone -- Pacific Standard Time; PST; GMT-08:00
Z -- 时区 -- RFC 822 time zone -- -0800
模式字母通常是重复的,其数量确定其精确表示, 详细的格式化及解析原则如下:
Text: 对于格式化来说,如果模式字母的数量大于等于 4,则使用完全形式;
否则,在可用的情况下使用短形式或缩写形式。
对于解析来说,两种形式都是可接受的,与模式字母的数量无关。
Number: 对于格式化来说,模式字母的数量是最小的数位,如果数位不够,则用 0 填充以达到此数量。
对于解析来说,模式字母的数量被忽略,除非必须分开两个相邻字段。
Year: 如果格式器的 Calendar 是格里高利历,则应用以下规则
对于格式化来说,如果模式字母的数量为 2,则年份截取为 2 位数,否则将年份解释为 number,即用 0 填充.
对于解析来说,如果模式字母的数量大于 2,则年份照字面意义进行解释,而不管数位是多少。
因此使用模式 "MM/dd/yyyy",将 "01/11/12" 解析为公元 12 年 1 月 11 日。
在解析缩写年份模式("y" 或 "yy")时,SimpleDateFormat 必须相对于某个世纪来解释缩写的年份。
这通过将日期调整为 SimpleDateFormat 实例创建之前的 80 年和之后 20 年范围内来完成。
例如,在 "MM/dd/yy" 模式下,如果 SimpleDateFormat 实例是在 1997 年 1 月 1 日创建的,
则字符串 "01/11/12" 将被解释为 2012 年 1 月 11 日,
而字符串 "05/04/64" 将被解释为 1964 年 5 月 4 日。
在解析时,只有恰好由两位数字组成的字符串(如 Character.isDigit(char) 所定义的)被解析为默认的世纪。
其他任何数字字符串将照字面意义进行解释,
例如单数字字符串,3 个或更多数字组成的字符串,或者不都是数字的两位数字字符串(例如"-1")。
因此,在相同的模式下, "01/02/3" 或 "01/02/003" 解释为公元 3 年 1 月 2 日。
同样,"01/02/-3" 解析为公元前 4 年 1 月 2 日。
否则,则应用日历系统特定的形式。
对于格式化和解析,如果模式字母的数量为 4 或大于 4,则使用日历特定的 long form。
否则,则使用日历特定的 short or abbreviated form。
Month: 如果模式字母的数量为 3 或大于 3,则将月份解释为 text;否则解释为 number。
General time zone: 如果时区有名称,则将它们解释为 text。
RFC 822 time zone: 对于格式化来说,使用 RFC 822 4-digit 时区格式.
SimpleDateFormat 还支持本地化日期和时间模式 字符串。
在这些字符串中,以上所述的模式字母可以用其他与语言环境有关的模式字母来替换。
SimpleDateFormat 不处理除模式字母之外的文本本地化;而由类的客户端来处理。
(2)常用的方法
public SimpleDateFormat()
用默认的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
注:此构造方法可能不支持所有语言环境。要覆盖所有地区,请使用 DateFormat 类中的工厂方法。
public SimpleDateFormat(String pattern)
用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
注:此构造方法可能不支持所有语言环境。要覆盖所有语言环境,请使用 DateFormat 类中的工厂方法。
public SimpleDateFormat(String pattern, Locale locale)
用给定的模式和给定语言环境的默认日期格式符号构造 SimpleDateFormat。
注:此构造方法可能不支持所有语言环境。要覆盖所有语言环境,请使用 DateFormat 类中的工厂方法。
public SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)
用给定的模式和日期符号构造 SimpleDateFormat。
public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos)
将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer。
public Date parse(String text, ParsePosition pos)
解析字符串的文本,生成 Date。
此方法试图解析从 pos 给定的索引处开始的文本。如果解析成功,
则将 pos 的索引更新为所用最后一个字符后面的索引(不必对直到字符串结尾的所有字符进行解析),并返回解析得到的日期。
更新后的 pos 可以用来指示下次调用此方法的起始点。
如果发生错误,则不更改 pos 的索引,并将 pos 的错误索引设置为发生错误处的字符索引,并且返回 null。
public Date parse(String source) throws ParseException
继承自DateFormat, 从给定字符串的开始解析文本,以生成一个日期。该方法不使用给定字符串的整个文本。
public String toPattern()
返回描述此日期格式的模式字符串。
public String toLocalizedPattern()
返回描述此日期格式的本地化模式字符串。
public void applyPattern(String pattern)
将给定模式字符串应用于此日期格式。
public void applyLocalizedPattern(String pattern)
将给定的本地化模式字符串应用于此日期格式。
public DateFormatSymbols getDateFormatSymbols()
获取此日期格式的日期和时间格式符号的一个副本。
public void setDateFormatSymbols(DateFormatSymbols newFormatSymbols)
设置此日期格式的日期和时间格式符号。
5.DateFormatSymbols
DateFormatSymbols 是一个公共类,用于封装可本地化的日期-时间格式化数据,如月名、星期几的名称和时区数据。
DateFormat 和 SimpleDateFormat 都使用 DateFormatSymbols 封装此信息。
通常不应直接创建对象,可通过DateFormate或SimpleDateFormat对象取得之后,作修改,然后设置.
SimpleDateFormat sdf = new SimpleDateFormat();
DateFormatSymbols dfSymbols = sdf.getDateFormatSymbols();
dfSymbols.setAmPmStrings(new String[] {"上午am", "下午pm"});
sdf.setDateFormatSymbols(dfSymbols);
public static final DateFormatSymbols getInstance()
获取默认语言环境的 DateFormatSymbols 实例。
此方法可访问 Java 运行时本身以及已安装 DateFormatSymbolsProvider 实现所支持的语言环境的 DateFormatSymbols 实例。
public static final DateFormatSymbols getInstance(Locale locale)
获取指定语言环境的 DateFormatSymbols 实例。
此方法可访问 Java 运行时本身以及已安装 DateFormatSymbolsProvider 实现所支持的语言环境的 DateFormatSymbols 实例。
public String[] getEras()
获取年代字符串。例如:"AD" 和 "BC"。
public void setEras(String[] newEras)
设置年代字符串。例如:"AD" 和 "BC"。
public String[] getMonths()
获取月份字符串。例如:"January"、"February" 等等。
public void setMonths(String[] newMonths)
设置月份字符串。例如:"January"、"February" 等等。
public String[] getShortMonths()
获取简短形式的月份字符串。例如:"Jan"、"Feb" 等等。
public void setShortMonths(String[] newShortMonths)
设置简短形式的月份字符串。例如:"Jan"、"Feb" 等等
public String[] getWeekdays()
获取星期字符串。例如:"Sunday"、"Monday" 等等。
public void setWeekdays(String[] newWeekdays)
设置星期字符串。例如:"Sunday"、"Monday" 等等。
public String[] getShortWeekdays()
获取简短形式的星期字符串。例如:"Sun"、"Mon" 等等。
public void setShortWeekdays(String[] newShortWeekdays)
设置简短形式的星期字符串。例如:"Sun"、"Mon" 等等。
public String[] getAmPmStrings()
获取 ampm 字符串。例如:"AM" 和 "PM"。
public void setAmPmStrings(String[] newAmpms)
设置 ampm 字符串。例如:"AM" 和 "PM"。