Date类表示特定的瞬间,精确到毫秒
在JDK1.1之前,类Date有两个其他的函数。它允许把日期解释为年、月、日、时、分、秒。它也允许格式化和解析日期字符串。不过,这些函数API不易于实现国际化。从JDK1.1开始,应该使用calendar类实现日期和时间之间转换,使用DateFormat类来格式化和解析日期字符串。另外Date中相应的方法已经被废弃。
尽管Date类打算反映协调世界时(UTC),但无法做到如此准确,这取决于Java虚拟机的主机环境。当前几乎所有操作系统都假定1天=24X60X60=86400秒,但对于UTC,大约每一两年出现一次额外的一秒,称为“闰秒”。闰秒始终作为当前最后一秒增加,并且始终在12月31日或者6月30日增加。1995年的最后一分钟是61秒,因为增加了闰秒,大多数计算机时钟不是特别的准确,所以不能反映闰秒的差别。
一些计算机标准是按照格林威志标准时(GMT)定义的,格林威治标准时和世界时(UT)是相等的。“GMT”是标准的“民间”名称;UT是相同标准的“科学”名称。
UTC和UT的区别是:
UTC是基于原子时钟的,UT是基于天体观察的,两者在实际应用中难分轩轾的。因为地球的旋转不是均匀的(它以复杂的方式减速和加速),所以UT始终始终不是均匀的流过,闰秒是根据需要引入UTC的,以便把UTC保持在UT1的0.9秒之内,UT1是应用了某些更正的UT版本。还有其他的时间和日期系统;例如:基于卫星的全球定位系统(GPS)使用的时间刻度与UTC同步,但没有针对闰秒进行调准。
在类Date所有可以接受或返回年、月、日期、小时、分钟和秒值的方法中,将使用下面的表示形式:
1.年份y由整数y-100表示。
2.月份由0至11的整数表示;0是一月、1是二月等等,因此11是十二月。
3.日期(一月中的某天)按通常方式由1至31表示。
4.小时由从0至23的整数表示。
5.分钟按通常方式由0至59的整数表示。
6.秒由0至61的整数表示;值60和61值对闰秒发生,尽管那样,也只用在实际正确跟踪闰秒的Java实现中,于按当前引入闰秒的方式,两个闰秒在同一分钟内发生是极不可能的,但此规范遵循 ISO C 的日期和时间约定。
注:在所有情形中,针对这些目的赋予方法的参数不需要在指定的范围内;例如:可以把日期定义为1月32日,这样的话会被解释为2月1日的相同含义。
常用构造函数:
//使用系统当前时间创建日期对象
Date()
//表示从标准基准时间(称为"历元(epoch)")即1970年1月1日00:00:00GMT以后的指定毫秒数创建日期对象
Date(long date)
//创建指定年、月、日的日期对象。已过时,从JDK1.1开始被Calendar.set(year+1900,month,date)或者GregorianCalendar(year + 1900,month,date)取代
Date(int year, int month, int date)
//创建指定年、月、日、时、分、秒的日期对象。已过时从JDK1.1开始,由Calendar.set(year+1900,month,date,hrs,min,sec)或则GregorianCalendar(year + 1900,month,date,hrs,min,sec)取代;
Date(int year, int month, int date,
int hrs, int min, int sec)
//如果当前日期对象在when指定的日期对象之后,返回true,否则返回false
boolean after(Date when)
//如果当前日期对象在when指定的日期对象之前,返回true,否则返回false
boolean before(Date when)
//设置此Date对象,以表示1970年1月1日00:00:00GMT以后time毫秒的时间点
void setTime(long time)
//获取自1970年1月1日00:00:00GMT以来此Date对象表示的毫秒数。
long getTime()
//判断两个日期是否完全相同
boolean equals(Object obj)
//返回日期的格式化字符串,包括星期几
String toString()
测试小案例:
public class DateTest {
public static void main(String[] args) {
//获取当前系统的日期和时间
Date date = new Date();
//打印当前日期和时间
System.out.println("当前日期和时间是:" + date);
//获取自1970年1月1日00:00:00开始的毫秒数
long time = date.getTime();
//打印
System.out.println("自1970至今的毫秒数:" + time);
}
}
日期格式化工具类(字符串和日期的相互转换)
/**
* 日期格式化的工具类
* @author Liao
*
*/
public class DateUtil {
/**
* 重载方法,把日期格式化为特定的字符串
* @param date
* @return
*/
public static String dateToString(Date date){
return dateToString(date, "yyyy-MM-dd hh:mm:ss");
}
/**
* 把日期格式化为字符串
* @param date
* @param pattern
* @return
*/
public static String dateToString(Date date,String pattern){
if (date != null){
//字符串格式化
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
//返回格式化以后的字符串
return sdf.format(date);
}
return "";
}
/**
* 把字符串转换为固定格式的日期
* @param str 字符串
* @return
*/
public static Date strToDate(String str){
return strToDate(str, "yyyy-MM-dd hh:mm:ss");
}
/**
* 把字符串转换为指定的日期格式
* @param str
* @param pattern
* @return
*/
public static Date strToDate(String str,String pattern){
//创建格式化
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
//定义日期
Date date = null;
try {
//把字符串转换为日期
date = sdf.parse(str);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
/*public static void main(String[] args) {
System.out.println(DateUtil.dateToString(new Date()));
System.out.println(DateUtil.dateToString(new Date(), "yyyy-MM-dd"));
System.out.println(DateUtil.strToDate("2014-12-23 11:11:11"));
System.out.println(DateUtil.strToDate("2014-12-23", "yyyy-MM-dd"));
}*/
}
项目真实案例:
规定系统的日志会在每个月的1号0时0分0秒进行删除,那么此时我们就可以用到Date类中的after()和before()方法,下面我们通过一个例子来深入体会这两个方法,指定我今年的生日为2014-12-17(通过工具类把字符串转换为Date类型)。
/**
* 日期的比较
* @author Liao
*
*/
public class CompareDateTest {
public static void main(String[] args) {
// 指定一个日期
Date birthday = DateUtil.strToDate("2014-12-17 22:28:58", "yyyy-MM-dd hh:mm:ss");
// 获取当前日期
Date date = new Date();
// 如果指定的日期即生日在当前日期之前
if (birthday.before(date)) {
System.out.println("我的生日已经过了!");
} else if (birthday.equals(date)) {//如果时间相等
System.out.println("生日快乐!");
} else if (birthday.after(date)) {//如果指定日期即生日在当前日期之后
System.out.println("我的生日还没到!");
}
}
}