Java Date工具类

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("我的生日还没到!");
		}
	}
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值