时间日历:Date、Calendar

一、Date

(一)概述
1、Date:表示特定的瞬间,精确到毫秒。
2、构造方法:
  • Date():根据当前的默认毫秒值创建日期对象
  • Date(long date):根据给定的毫秒值创建日期对象(注意时区,这边是东8区)
<span style="font-family:Arial;font-size:18px;">	/*
	 * Date:表示特定的瞬间,精确到毫秒。 
	 * 
	 * 构造方法:
	 * 		Date():根据当前的默认毫秒值创建日期对象
	 * 		Date(long date):根据给定的毫秒值创建日期对象
	 */
	public void test1(){
		// 创建对象
		Date d = new Date();
		System.out.println("d:" + d);

		// 创建对象
		// long time = System.currentTimeMillis();
		long time = 1000 * 60 * 60; // 1小时
		Date d2 = new Date(time);
		System.out.println("d2:" + d2);
		
	}</span>
(二)常用功能
1、简单功能
1)public long getTime():获取时间,以毫秒为单位
2)public void setTime(long time):设置时间,和有参构造方法功能一致
2、SimpleDateFormat:Date 与 String 的转换
1)构造方法,获取格式:
  • SimpleDateFormat sdf = new SimpleDateFormat(String pattern)
2)解析或格式化:
  • format:Date --> String
  • parse:String --> Date
<span style="font-family:Arial;font-size:18px;">	/**
	 * 将String转换成Date
	 */
	public synchronized static Date stringToDate(String pattern, String p_date_s) throws ParseException {
		if (p_date_s == null || "".equals(p_date_s))
			return null;
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.parse(p_date_s);
	}

	/**
	 * 将Date转换成String
	 */
	public static String dateToString(String pattern, Date p_string_d){
		if (p_string_d == null)
			return null;
		SimpleDateFormat sdf = null;
		try {
			sdf = new SimpleDateFormat(pattern);
		} catch (Exception e) {
			logger.error(DateUtils.class, e);
		}
		return sdf.format(p_string_d);
	}
</span>
 
二、Calendar
(一)概述
1、Calendar:它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
2、初始化:子类对象(根据时区等参数创建一个子类对象)
  • Calendar rightNow = Calendar.getInstance(); 
(二)日常功能
1、public int get(int field):返回给定日历字段的值。
1)日历类中的每个日历字段都是静态的成员变量,并且是int类型。(注意月的使用)
2)getTime():得到 Date 类型的时间
3)实例:
<span style="font-family:Arial;font-size:18px;">	/*
	 * Calendar:它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
	 * 
	 * public int get(int field):返回给定日历字段的值。日历类中的每个日历字段都是静态的成员变量,并且是int类型。
	 */
	public void test1(){
		
		// 其日历字段已由当前日期和时间初始化:
		Calendar rightNow = Calendar.getInstance(); // 子类对象

		// 获取年
		int year = rightNow.get(Calendar.YEAR);
		// 获取月
		int month = rightNow.get(Calendar.MONTH);//月的处理注意,是从0开始的
		// 获取日
		int date = rightNow.get(Calendar.DATE);

		System.out.println(year + "年" + (month + 1) + "月" + date + "日");
	}</span>
2、public void add(int field,int amount)
1)根据给定的日历字段和对应的时间,来对当前的日历进行操作。
2)实例:
  • 计算3年前的今天
  • 5年后的10天前。
3、public final void set(int year,int month,int date):
1)设置当前日历的年月日
2)实例:
<span style="font-family:Arial;font-size:18px;">/*
	 * public void add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作。
	 * public final void set(int year,int month,int date):设置当前日历的年月日
	 */
	public void test2(){
		
		// 1-获取当前的日历时间
		Calendar c = Calendar.getInstance();

		// 获取年
		int year = c.get(Calendar.YEAR);
		// 获取月
		int month = c.get(Calendar.MONTH);
		// 获取日
		int date = c.get(Calendar.DATE);
		System.out.println(year + "年" + (month + 1) + "月" + date + "日");
		
		System.out.println("--------------------------------");

		// 2-根据给定的日历字段和对应的时间,来对当前的日历进行操作。
		 // 三年前的今天
		 c.add(Calendar.YEAR, -3);
		 // 获取年
		 year = c.get(Calendar.YEAR);
		 // 获取月
		 month = c.get(Calendar.MONTH);
		 // 获取日
		 date = c.get(Calendar.DATE);
		 System.out.println(year + "年" + (month + 1) + "月" + date + "日");
		 
		 System.out.println("--------------------------------");

		// 5年后的10天前
		c.add(Calendar.YEAR, 5);
		c.add(Calendar.DATE, -10);
		// 获取年
		year = c.get(Calendar.YEAR);
		// 获取月
		month = c.get(Calendar.MONTH);
		// 获取日
		date = c.get(Calendar.DATE);
		System.out.println(year + "年" + (month + 1) + "月" + date + "日");
		System.out.println("---------------------------------");

		// 设置当前日历的年月日
		c.set(2011, 11, 11);
		// 获取年
		year = c.get(Calendar.YEAR);
		// 获取月
		month = c.get(Calendar.MONTH);//set设置多少,就是多少
		// 获取日
		date = c.get(Calendar.DATE);
		System.out.println(year + "年" + (month) + "月" + date + "日");
		
		Date day = c.getTime();
		System.out.println(DateUtils.dateToString("yyyy-mm-dd", day));
		
	}</span>
 
4、compareTo():比较
1)Calendar,实现了 Comparable 接口,可以两个时间的比较
2)比较的结果:(小于:-1 ;大于:1 ;相同:0)
5、clone():克隆
1)Calendar 实现了Cloneable 接口
(三)面试题
1、获取任意一年的二月有多少天
<span style="font-family:Arial;font-size:18px;">/**
	 * 获取任意一年的二月有多少天
	 */
	public void test3(){
		
		// 键盘录入任意的年份
		int year = 2015;

		// 设置日历对象的年月日
		Calendar c = Calendar.getInstance();
		c.set(year, 2, 1); //其实是这一年的3月1日
		
		// 把时间往前推一天,就是2月的最后一天
		c.add(Calendar.DATE, -1);

		// 获取这一天输出即可
		System.out.println(c.get(Calendar.DATE));
	}
	</span>

2、获取某年某月的所有工作日
<span style="font-family:Arial;font-size:18px;">package util.date;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
/**
 * 
 * JavaDate.java
 *
 * @title 
 * @description
 * @author SAM-SHO 
 * @Date 2014-10-22
 */
public class JavaDate {
	private static Logger logger = Logger.getLogger(JavaDate.class);

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JavaDate tJavaDate = new JavaDate();

		List<Date> dates = tJavaDate.getDates(2014, 8, 6);
		for (Date date : dates) {
			logger.debug(DateUtils.dateToString("yyyy-MM-dd", date));
		}
		
		List<Date> allWorkdates = tJavaDate.getDates(2014, 10);
		for (Date date : allWorkdates) {
			logger.debug(DateUtils.dateToString("yyyy-MM-dd", date));
		}

		 tJavaDate.CalendarTest();

	}

	/**
	 * 获取某年某月的指定工作日
	 * 
	 * @param year
	 * @param month
	 * @return
	 */
	private List<Date> getDates(int year, int month, int len) {
		List<Date> dates = new ArrayList<Date>();
		int leng = 0;

		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month - 1);
		cal.set(Calendar.DATE, 1);

		while (cal.get(Calendar.YEAR) == year && cal.get(Calendar.MONTH) < month) {
			int day = cal.get(Calendar.DAY_OF_WEEK);

			if (!(day == Calendar.SUNDAY || day == Calendar.SATURDAY)) {

				Date date = (Date) cal.getTime().clone();
				if (isNotHolidayOfCN(date)) {
					dates.add(date);
					leng++;
				}
				if (leng == len) {// 取指定日期天数
					break;
				}
			}
			cal.add(Calendar.DATE, 1);// 加一天
		}
		return dates;

	}

	/**
	 * 获取某年某月的所有工作日
	 * 
	 * @param year
	 * @param month
	 * @return
	 */
	private List<Date> getDates(int year, int month) {
		List<Date> dates = new ArrayList<Date>();
		Date date = null;

		// 重置时间为输入年月的第一天
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month - 1);
		cal.set(Calendar.DATE, 1);
		
//		cal.set(year, month-1, 1);

		while (cal.get(Calendar.YEAR) == year && (cal.get(Calendar.MONTH)+1) == month) {
			int day = cal.get(Calendar.DAY_OF_WEEK);//是一个星期的第几天
			date = (Date) cal.getTime().clone();

			if (!(day == Calendar.SUNDAY || day == Calendar.SATURDAY)) {
				if (isNotHolidayOfCN(date)) {
					dates.add(date);
				}
			} else {
				if (isWorkDay(date)) {
					dates.add(date);
				}
			}
			cal.add(Calendar.DATE, 1);// 加一天
		}
		return dates;

	}

	/**
	 * 定义的法定假日
	 * 
	 * @param date
	 * @return 不是法定假日,返回true
	 */
	public boolean isNotHolidayOfCN(Date date) {

		String strDate = DateUtils.dateToString("yyyy-MM-dd", date);

		List<String> fDDates = new ArrayList<String>();
		fDDates.add("2014-10-01");// 配置在数据库
		fDDates.add("2014-10-02");
		fDDates.add("2014-10-03");
		fDDates.add("2014-10-04");
		fDDates.add("2014-10-05");
		fDDates.add("2014-10-06");
		fDDates.add("2014-10-07");

		if (!fDDates.contains(strDate)) {// 不包含返回true
			return true;
		}
		return false;
	}

	/**
	 * 定义的调整上班日
	 * 
	 * @param date
	 * @return 是调整的工作日,返回true
	 */
	public boolean isWorkDay(Date date) {

		String strDate = DateUtils.dateToString("yyyy-MM-dd", date);

		List<String> fDDates = new ArrayList<String>();
		fDDates.add("2014-10-11");// 配置在数据库

		if (fDDates.contains(strDate)) {// 包含返回true
			return true;
		}
		return false;
	}

	/**
	 * 有关 Calendar 类的一些测试
	 */
	public void CalendarTest() {

		// 创建 Calendar 对象
		Calendar calendar = Calendar.getInstance();
		// 初始化 Calendar 对象,但并不必要,除非需要重置时间
		calendar.setTime(new Date());

		// setTime 类似上面一行
		// Date date = new Date();
		// calendar.setTime(date);

		// 显示年份
		int year = calendar.get(Calendar.YEAR);
		System.out.println("YEAR is = " + String.valueOf(year));

		// 显示月份 (从0开始, 实际显示要加一)
		int MONTH = calendar.get(Calendar.MONTH);
		System.out.println("MONTH is = " + (MONTH + 1));
		
		int Day = calendar.get(Calendar.DATE);
		System.out.println("Day is = " + Day);
		
		// 今年的第 N 天
		int DAY_OF_YEAR = calendar.get(Calendar.DAY_OF_YEAR);
		System.out.println("DAY_OF_YEAR is = " + DAY_OF_YEAR);

		// 本月第 N 天
		int DAY_OF_MONTH = calendar.get(Calendar.DAY_OF_MONTH);
		System.out.println("DAY_OF_MONTH = " + String.valueOf(DAY_OF_MONTH));

		// 当前小时数
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		System.out.println("HOUR = " + hour);

		// 3小时以后
		calendar.add(Calendar.HOUR_OF_DAY, 3);
		int HOUR_OF_DAY = calendar.get(Calendar.HOUR_OF_DAY);
		System.out.println("HOUR_OF_DAY + 3 = " + HOUR_OF_DAY);

		// 当前分钟数
		int MINUTE = calendar.get(Calendar.MINUTE);
		System.out.println("MINUTE = " + MINUTE);

		// 15 分钟以后
		calendar.add(Calendar.MINUTE, 15);
		MINUTE = calendar.get(Calendar.MINUTE);
		System.out.println("MINUTE + 15 = " + MINUTE);

		// 30分钟前
		calendar.add(Calendar.MINUTE, -30);
		MINUTE = calendar.get(Calendar.MINUTE);
		System.out.println("MINUTE - 30 = " + MINUTE);

		// 格式化显示
		String str = DateUtils.dateToString("yyyy-MM-dd HH:mm:ss:SS", calendar.getTime());
		System.out.println("显示格式化时间  : " + str);

		// 重置 Calendar 显示当前时间
		calendar.setTime(new Date());
		str = DateUtils.dateToString("yyyy-MM-dd HH:mm:ss:SS", calendar.getTime());
		System.out.println("重置 Calendar 显示当前时间  : " + str);

		// 创建一个 Calendar 用于比较时间
		Calendar calendarNew = Calendar.getInstance();

		// 设定为 5 小时以前,后者大,显示 -1
		calendarNew.add(Calendar.HOUR, -5);
		System.out.println("时间比较:" + calendarNew.compareTo(calendar));

		// 设定7小时以后,前者大,显示 1
		calendarNew.add(Calendar.HOUR, +7);
		System.out.println("时间比较:" + calendarNew.compareTo(calendar));

		// 退回 2 小时,时间相同,显示 0
		calendarNew.add(Calendar.HOUR, -2);
		System.out.println("时间比较:" + calendarNew.compareTo(calendar));
	}

}
</span>
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值