java日期时间工具类

Data、Calendar、 GregorianCalendar 都是 Java.util包中的实用工具类。

Data(日期)

Date 类封装当前的日期和时间,也可以封装一个特定的日期。
Date 的构造函数:

Date()
Date(long millisec)

第一种形式的构造函数用当前日期和时间初始化对象。
第二种形式的构造函数接收一个参数,该参数等于从 1970 年 1 月 1 日 午夜起至今的毫秒数值。

Date 类中定义的方法

方法描述
boolean after(Date date)如果调用对象所包含的日期迟于由 date 指定的日期,则返回 true, 否则返回 false
boolean before(Date date)如果调用对象所包含的日期早于由 date 指定的日期,则返回 true, 否则返回 false
int compareTo(Date date)将调用对象的值与 date 的值进行比较。如果这两者数值相等,则返回 0; 如果调用对象早于由 date 的值,则返回一个负值;如果调用对象的值晚于 date 的值,则返回一个正值
boolean equals(Object date)如果调用对象包含的时间和日期与由 date 指定的日期和时间相同,则返回 true,否则返回 false
long getTime()返回自 1970 年 1月 1 日 起至今的毫秒数值
int hashCode()返回调用对象的散列值
void setTime(long time)按 time 的指定,设置时间和日期,表示自 1970 年 1 月 1 日午夜至今的以毫秒为单位的时间值
string toString()将调用 Date 对象转换成字符串并返回结果

Date 类的使用

 Date d1 = new Date();
Date d2 = new Date(1140203030304L);
System.out.println(d1);
System.out.println(d2);
if (d2.after(d1)){
    System.out.println("d2 晚于 d1");
}
System.out.println(d2.compareTo(d1));
d2.setTime(d1.getTime());
System.out.println(d2);

//Tue Jun 26 22:34:05 CST 2018
//Sat Feb 18 03:03:50 CST 2006
//-1
//Tue Jun 26 22:34:05 CST 2018

Calendar(日历)

抽象类 Calendar 提供了一组方法,这些方法允许将以毫秒为单位的时间转化为一组有用的分量。 一些可以提供信息的分量是:年、月、日、小时、分和秒。Calendar 的子类能提供特定的功能,以便按照他们本身的规则去解释时间信息,能够写出在几个国际环境下都能运行的 Java 类库。这种子类的一个例子是 GregorianCalendar.
GregorianCalendar 是一个大家所熟悉的标准日历(现在通用的阳历)的具体工具。
Calendar 的 getInstance() 方法返回默认的地区和时区的当前日期和当前时间所初始化的 GregorianCalendar(标准日历)。
GregorianCalendar 定义了两个域:AD 和 BC。它们代表由公历定义的两个纪元:公元后和公元前。
对 GregorianCalendar 类,也有几个构造函数。默认的 GregorianCalendar () 用 默认的地区和时区的当前日期和当前时间初始化对象。提供的 3 种构造函数:

GregorianCalendar (int year, int month, int date)
GregorianCalendar (int year, int month, int date, int hours, int minutes)
GregorianCalendar (int year, int month, int date, int hours, int minutes, int seconds)

以上三种形式中,都设置了 日、月 和 年。这里,year 表示公元纪年开始的年数。month 指定了月,Month 值是基于 0 的。 以 0 表示一月,以此类推,11 表示 12 月。月中的日由 date 指定,从 1 开始。
GregorianCalendar 对 Calendar 的所有抽象方法提供了实现工具。 它也提供了一下另外的方法。其中:

boolean isLeapYear(int year) // 判断某年是否是闰年

当 year 是一个闰年时,该方法返回 true,否则返回 false.

由 Calendar 定义的一些常用方法:

方法描述
abstract void add(int field, int amount)将amount 加到由field 指定的时间或日期分量
boolean after(Object when)如果调用对象所包含的日期晚于 when 指定的日期,则返回 true,否则返回 false
boolean before(Object when)如果调用对象所包含的日期早于 when 指定的日期,则返回 true,否则返回 false
final void clear()对调用对象的所有时间分量置 0
final void clear(int field)在调用对象中,对由field指定的时间分量置 0
boolean equals(Object when)如果调用对象所包含的日期与 when 指定的日期相等,则返回 true,否则返回 false
final get(int field)返回调用对象的一个分量的值。该分量 由 field指定。可以被请求的分量的示例有:Calendar.YEAR、Calendar.MONTH、Calendar.MINUTE等
static Locale[] getAvailableLocales()返回一个Locale对象的数组,其中包含了可以使用日历的地区
static Calendar getInstance()对默认的地区和时区,返回一个 Calendar 对象
static Calendar getInstance(Locale locale)对由 locale指定的地区,返回一个 Calendar对象,而时区使用默认的时区
static Calendar getInstance(TimeZone tz, Local local)对由 tz 指定的时区,同时由 locale 指定的地区返回一个 Calendar 对象
final Date getTime()返回一个与调用对象的时间相等的 Date 对象
TimeZone getTimeZone()返回调用对象的时区
final boolean isSet(int field)如果指定的时间分量被设置,则返回 true,否则返回 false
final void set(int field, int val)在调用对象中,将由field 指定的日期和时间分量付给由 val指定的值。 Field 必须是由 Calendar定义的域之一。例如 Calendar.HOUR
final void set(int year,int month,int dayOfMonth)设置调用对象的各种日期和时间分量
final void set(int year,int month, int dayOfMonth, int hours, int minutes)设置调用对象的各种日期和时间分量
final void set(int year,int month, int dayOfMonth, int hours, int minutes, int seconds)设置调用对象的各种日期和时间分量
final void setTime(Date d)设置调用对象的各种日期和时间分量。该信息从Date对象 d 中获取
void setTimeZone(TimeZone tz)将调用对象的时区设置为由 tz 指定的时区

Calendar 定义了一些常量用于得到或设置日历分量

常量描述
Calendar.YEAR年份
Calendar.MONTH月份
Calendar.DATE日期
Calendar.DAY_OF_MONTH日期,和上面的字段意义完全相同
Calendar.HOUR12小时制的小时
Calendar.HOUR_OF_DAY24小时制的小时
Calendar.MINUTE分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK星期几

日期的格式化与解析

java.text.DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类如(SimpleDateFormat)允许进行日期格式化(日期 –>文本),解析(文本–> 日期)和标准化,将日期表示为 Date对象,或者 表示为从 GMT(格林尼治标准时间)1970 年 1月 1日 00:00:00 这一刻开始的毫秒数。
DateFormat 提供了很多方法,以获取基于默认或给定语言环境和多种格式化风格的默认 日期/时间 “格式化器”。格式化风格包括 FULL, LONG, MEDIUM 和 SHORT。

要格式化一个当前语言环境下的日期,可以使用某个静态工厂方法:

myString = DateFormat.getDateInstance().format(myDate);

还可以使用 DateFormat 进行解析:

myDate = df.parse(myString);

日期格式化,主要用到DateFormat 中定义的format方法。

方法描述
public String final format(Date date)将一个 Date 格式化为日期/时间字符串。
public abstract StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition)将 date 的格式化字符串添加到 toAppendTo的末尾。
public final StringBuffer format (Object obj, StringBuffer toAppendTo, FieldPosition fieldPosition)将 obj 的格式化字符串添加到 toAppendTo的末尾。Obj 可以是 Date 对象,也可以是 Number 对象,其 longValue 是用毫秒计的时间。

日期解析主要用到DateFormat中定义的 parse 方法。

方法描述
public Date parse(String source) throws ParseException尝试将 source 解析成日期/时间对象。如果成功,就返回 Date对象,否则抛出异常
public abstarct Date Parse(String source ,ParsePosition pos)根据给定的解析位置开始解析日期/时间字符串。
public Object parseObject(String source,ParsePosition pos)解析字符串中的文本,以生成一个 Date。 该方法试图从 pos 所给定的索引处开始解析文本。如果解析成功,则将pos 的索引更新为所用最后一个字符后面的索引,并返回解析得到的日期。可以使用更新后的pos 指示下一次调用次方法的开始点。如果发生错误,则不更改 pos 的索引,并将 pos 的错误索引设置为发生错误处的字符索引,并且返回null。

如果愿意,还可以在格式上设置时区。如果相对格式化或解析施加更多的控制。可以尝试将工厂方法所获取的 DateFormat 强制转换为 SimpleDateFormat.这适用于大多数国家/地区。只是要记住将其放入一个 try代码块中,以防止遇到特殊的格式。
java.text.SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化 、解析和规范化。
SimpleDate Format 使得可以选择任何用户定义的日期-时间格式的模式。但是,任然建议通过 DateFormat中的 getTimeInstance ,getDateInstance,或 getDateTimeInstance 来创建日期-时间格式器。每一个这样的类方法都能够返回一个默认的格式初始化的日期/时间格式器。可以跟据需要使用 applyPattern() 方法来修改格式模式。

模式字母如下表:

字母日期或时间元素示例
G纪元标记AD
y四位年份1996;96
M年中的月份July;Jul;07
w年中的周数27
W月份中的周数2
D年中的天数360
d月份中的天数10
E星期中的天数Tuesday;Tue
F月份中的第几周的周几2 (second Wed. in July)
aAM/PM 标记PM
H一天中的小时 (0~23)22
k一天中的小时(1~24)24
KAM/PM中的小时数(0~11)10
hAM/PM中的小时数(1~12)12
m小时中的分钟数30
s分钟中的秒数55
S毫秒数234
z时区 General time ZonePacific Standard time;PST;GMT-08:00
Z时区 RFC822 time zone-0800

格式化和解析日期

package DateTimeTest;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTimeTest {
    public static void main(String[] args)throws ParseException {
        DateFormat df1 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
        Date d = new Date();
        String myString = df1.format(d);
        System.out.println("中等格式:"+ myString);

        d = df1.parse(myString);
        DateFormat df2 = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); 
        String myString2 =df2.format(d);
        System.out.println("完全格式:"+ myString2);

        d = df2.parse(myString2);
        System.out.println("默认解析后的结果是:" + d);

        SimpleDateFormat  sdf1 = (SimpleDateFormat) df2;
        System.out.println("sdf1 的解析模式:" + sdf1.toPattern());

        SimpleDateFormat  sdf2 = new SimpleDateFormat("今天是 yyyy 年 MM 月 dd 日 E kk 点 mm 分");
        System.out.println("自定义格式化的结果是 :"+ sdf2.format(d));

        String strDate = "2018 年 06 月 27 日";
        String pattern = "yyyy 年 MM 月 dd 日";
        sdf2.applyPattern(pattern);
        d = sdf2.parse(strDate);
        System.out.println("自定义的解析结果是:" + d); 
    } 
}
// 中等格式:Jun 27, 2018 11:19:23 PM
// 完全格式:Wednesday, June 27, 2018 11:19:23 PM CST
// 默认解析后的结果是:Wed Jun 27 23:19:23 CST 2018
// sdf1 的解析模式:EEEE, MMMM d, yyyy h:mm:ss a z
// 自定义格式化的结果是 :今天是 20180627 日 Wed 2319 分
// 自定义的解析结果是:Wed Jun 27 00:00:00 CST 2018
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值