一、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>