Java中日期概述
日期在Java中是一块很复杂的内容,对于一个日期在不同的语言国际环境中日期的国际化,日期和时间的相互转换,日期的运算,日期的展现格式等都是比较复杂的问题,为此Java提供了一些日期相关类来解决这些问题。
java.util.Date
下面是Date常见的方法
Date(); // 构造函数,默认是系统当前时间
Date(long date); // 构造方法,基准时间到指定时间的毫秒数
boolean after(Date when); // 测试时间是否在指定日期之后
boolean before(Date when); // 测试时间是否在指定日期之前
int compareTo(Date anotherDate); // Date类重写了compareTo方法,实现了时间的比较
long getTime(); // 返回基准时间到该时间之间的毫秒数
void setTime(long time); // 以基准时间为起点,加毫秒数来设置Date对象
import java.util.Date;
public class DateDemo {
public static void main(String args[]) throws Exception{
// 创建对象,默认为系统当前时间
Date d1 = new Date();
// 打印系统当前时间
System.out.println("当前时间:" + d1.toString());
// 设置对象时间
Date d2 = new Date(1338408932730L);
System.out.println("d2时间:" + d2.toString());
// 时间比较
System.out.println("d1大于d2:" + d1.after(d2));
System.out.println("d1小于d2:" + d1.before(d2));
System.out.println("copareTo比较结果:" + d1.compareTo(d2));
// 时间毫秒数的设置与获取
d2.setTime(d2.getTime() + 10000*10000);
System.out.println(d2.getTime());
}
}
java.text.DateFormat
DateFormat是日期/时间格式化抽象类,它以与语言无关的方式格式化并解析日期或时间,也就是说该类负责实现Date类型与String类型的相互转换。DateFormat作为一个抽象类是无法创建对象的,但其可以使用静态工厂的方法,创建子类对象来完成相关转换操作,实际上还是由SimpleDateFormat类来完成的。
DateFormat的方法较多,这里就列举些常用的方法。
-- 获取DateFormat实例,DateFormat是抽象类,但为了方便使用,提供了获取实例的静态方法。下面只给出三个不带参数的方法,个人认为带参数指定格式的方法,使用复制,并且不常见,故省略。如果不是默认的格式,使用自定义格式会更方便些。
// 获取日期格式器,该格式器具有默认语言环境的默认格式化风格
static DateFormat getDateInstance();
// 获取日期/时间格式器,该格式器具有默认语言环境的默认格式化风格
static DateFormat getDateTimeInstance();
// 获取时间格式器,该格式器具有默认语言环境的默认格式化风格
static DateFormat getTimeInstance();
-- Date类型和文本类型的相互转化方法
String format(Date date); // 将一个Date格式化为日期/时间字符串
Date parse(String source); // 从给定字符串的头部开始解析,以生成一个日期
SimpleDateFormat是DateFormat的子类,用来创建用户自定义的日期-时间格式器。但还是建议通过DateFormat中的getDateInstance()、getTimeInstance()或getDateTimeInstance()来创建日期-时间格式器,根据需要使用applyPattern方法来修改模式。看到这里大家可能会有疑问。
DateFormat中的方法返回的是DateFormat对象(API提供的),而在DateFormat类中又没有applyPattern方法,这怎么用?使用SimpleDateFormat类来创建用户自定义的日期-时间格式器,用的好好的,为什么建议使用DateFormat中的方法来创建格式器,再用applyPattern方法来修改模式?
第一个问题:查看源码我们发现,DateFormat中的方法其实返回是就SimpleDateFormat对象,所以我们只需要将返回的DateFormat对象强转成SimpleDateFormat对象,自然就能调用SimpleDateFormat中的applyPattern()来修改模式;第二个问题:底层用的都是SimpleDateFormat类,但通过DateFormat中方法获取实例,使用的是工厂模式(好处参照java工厂模式),所以相对于new SimpleDateFormat(),JDK建议使用DateFormat中的方法来获取格式器。
下面介绍下SimpleDateFormat类的常用方法
SimpleDateFormat(); // 用默认的模式和默认语言环境的日期格式
SimpleDateFormat(String pattern); //用给定的模式和默认语言环境的日期格式
void applyPattern(String pattern); // 修改日期-时间格式器的模式
String toPattern(); // 返回该日期-时间格式器的模式字符串
下面是DateFormat的一段演示的实例
package com;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatDemo {
public static void main(String args[]) throws Exception {
showDateFormat();
showSimpleDateFormat();
}
// DateFormat常用方法演示
public static void showDateFormat() throws Exception {
Date date = new Date();
// 获取常用默认格式器
DateFormat df1 = DateFormat.getDateInstance();
DateFormat df2 = DateFormat.getDateTimeInstance();
DateFormat df3 = DateFormat.getTimeInstance();
// 对Date对象按指定的格式来格式化
System.out.println("date: " + df1.format(date));
System.out.println("dateTime: " + df2.format(date));
System.out.println("time: " + df3.format(date));
// 将文本类型按指定格式转成Date对象
String sd1 = "2015-8-1";
String sd2 = "2015-8-1 18:36:35";
String sd3 = "18:36:35";
// 解析时需要保证字符串的格式和DateFormat的格式匹配
Date d1 = df1.parse(sd1);
Date d2 = df2.parse(sd2);
Date d3 = df3.parse(sd3);
System.out.println(df2.format(d1));
System.out.println(df2.format(d2));
System.out.println(df2.format(d3));
// 修改格式器
SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance();
System.out.println(sdf.toPattern() + ": " + sdf.format(date));
sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.toPattern() + ": " + sdf.format(date));
}
// SimpleDateFormat常用方法演示
public static void showSimpleDateFormat() {
Date date = new Date();
// 创建指定模式的格式器
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date));
// 修改格式器的模式
sdf.applyPattern("yy-MM-dd hh:mm aaa");
System.out.println(sdf.format(date));
// 获取格式器的模式字符串
System.out.println(sdf.toPattern());
}
}
java.util.Calendar
Calendar是一个抽象类,是系统时间的抽象表示,为操作日历提供了一些方法,并且能将操作后的结果转换成Date对象,其实Calendar类就是用来负责Date对象值的修改操作。Calendar是抽象类,自然就无法创建对象,但是可以通过getInstance()来获取Calendar对象实例(其实是子类对象实例,与上面的DateFormat类似,也是通过获取GregionCalendar子类对象来实现的,不同的是底层的实现原理有点不同,这里没有用工厂模式,是直接创建的,于是API也就没有推荐使用getInstance()来获取实例)。
下面介绍下Calendar类的常用方法
// 获取一个默认时区和指定语言环境的Calendar实例,
static Calendar getInstance();
-- Date类与Calendar类的相互转化
// 返回一个Calendar时间值的Date对象
Date getTime();
// 用给定的Date设置此Calendar的时间
void setTime(Date date);
-- Long类与Calendar类的相互转化
// 获取Calendar的时间值,以毫秒为单位
long getTimeInMillis();
// 用给定的long值设置此Calendar的当前时间值
void setTimeInMillis(long millis);
-- 对日历时间的修改
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
void add(int field, int amount);
// 返回给定日历字段的值
int get(int field);
// 设置给定日历字段的值
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);
GregorianCalendar类是Calendar类子类,用来创建日期对象实例,日历类功能的实现还是通过GregorianCalendar类来实现的。GregorianCalendar类自己的方法较少这里就不列举了。下面通过一段实例来体验Calendar的用法。
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class CalendarDemo {
public static void main(String args[]) throws Exception{
showCalendar();
}
public static void showCalendar() {
Date date = new Date();
date.setTime(1338584503063L);
// 获取Calender实例
Calendar cd = Calendar.getInstance();
// 获取Calendar中当前的Date对象
System.out.println(cd.getTime());
// 用Date对象设置Calendar对象的值
cd.setTime(date);
System.out.println(cd.getTime());
// 用long值设置此Calendar的当前时间
cd.setTimeInMillis(1538584503063L);
System.out.println(cd.getTime());
// 获取Calendar中的时间值
System.out.println(cd.getTimeInMillis());
// 为指定日历字段添加指定时间量
cd.add(5, 30);
System.out.println(cd.getTime());
// 设置给定日历字段的值
cd.set(5, 30);
System.out.println(cd.getTime());
// 获取给定日历字段的值
System.out.println(cd.get(1));
// 设置年月日时分秒
cd.set(2015, 8, 3, 15, 13, 30);
System.out.println(cd.getTime());
}
public static void showGregionCalendar() {
// 创建一个GregorianCalendar对象gc,gc与上面的cd使用基本类似
// 其实cd是被向上转型的gc,这里就不重复演示了
GregorianCalendar gc = new GregorianCalendar();
}
}
Java中日期常用总结
Java中日期的常用方法有以下三个方面:
1、日期的创建;
2、日期的格式化显示与转换(主要是Date与String间的转换);
3、日期中年、月、日、时、分、秒、星期的获取与修改,还有日期的比较;
第一条就比较简单了,第二条就是通过DateFormat类来实现的,第三条就是通过Calendar类来实现的;理清楚了它们之间的关系,具体功能参照下API就可以了。