一、日期处理类
在 JDK 1.1 之前,类 Date
有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 1.1 开始,应该使用 Calendar
类实现日期和时间字段之间转换,使用 DateFormat
类来格式化和解析日期字符串。Date
中的相应方法已废弃
1、Date
package com; import java.util.Date; /**
* Created by Administrator on 2016/11/8.
*/
public class Test { public static void main(String arg[]){
/**
* Date 有两个构造方法
* 1、用来获取当前系统时间
* 2、分配 Date 对象并初始化此对象,以表示自从标准基准时间
* (称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数
*/
Date date = new Date();
System.out.println(date);
Date date1 = new Date(123l);
Date date2 = new Date(123l);
System.out.println(date1); /**
* Date的方法,下面列出的是未过时的,获取年、月、日及格式化方法已废弃,将由Calendar类实现,以便于国际化
*/
System.out.println("测试此日期是否在指定日期之后 : " + date.after(date1));
System.out.println("测试此日期是否在指定日期之前 : " + date.before(date1));
System.out.println("返回对象的副本 : " + date.clone());
System.out.println("比较两个日期的顺序 : " + date.compareTo(date1));
System.out.println("比较两个日期的相等性 : " + date1.equals(date2));//比较的是值
System.out.println("返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 : " + date.getTime());
System.out.println("返回此对象的哈希码值 : " + date.hashCode());
date.setTime(12345l);//设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点
System.out.println("setTime设置后的date为 : " + date);
System.out.println("把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat) : " + date.toString());
} }
java有3中比较日期的方法
- 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
- 使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
- 使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。
2、SimpleDateFormat
SimpleDateFormat
是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
public class Test {
public static void main(String arg[]) {
/**
*SimpleDateFormat构造方法,有4个,下面介绍常用的两个
* 1.用默认的模式和默认语言环境的日期格式符号构造
* 2 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat
*/
Date date01 = new Date();
SimpleDateFormat sdf01 = new SimpleDateFormat();
System.out.println(sdf01.format(date01));
SimpleDateFormat sdf02 = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
System.out.println(sdf02.format(date01) + "\n"); /**
* SimpleDateFormat方法
*/
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
String str = sdf.format(date);
System.out.println(str);
try {
sdf.applyLocalizedPattern("E");
System.out.println("将给定的本地化模式字符串应用于此日期格式 : " + sdf.format(date));
}catch (Exception e) {
System.out.println("input format error, error information : " + e);
}
sdf.applyPattern("yyyy-MM-dd");
System.out.println("将给定模式字符串应用于此日期格式 : " + sdf.format(date));
SimpleDateFormat sdf1 = (SimpleDateFormat) sdf.clone();
System.out.println("创建此 SimpleDateFormat 的一个副本 : " + sdf.clone());
System.out.println("比较给定对象与此 SimpleDateFormat 的相等性 : " + sdf.equals(sdf1));
StringBuffer sb = new StringBuffer("当前时间是[");
System.out.println("将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer : " + sdf.format(date, sb, new FieldPosition(1)) + "]");
System.out.println("格式化生成 AttributedCharacterIterator 的对象 : " + sdf.formatToCharacterIterator(date).getAllAttributeKeys());
System.out.println("返回在 100 年周期内被解释的两位数字年份的开始日期 : " + sdf.get2DigitYearStart());
System.out.println("解析字符串的文本,生成 Date : " + sdf.parse(str, new ParsePosition(1)));
System.out.println("返回描述此日期格式的本地化模式字符串 : " + sdf.toLocalizedPattern());
System.out.println("返回描述此日期格式的模式字符串 : " + sdf.toPattern());
} }
时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:
字母 | 描述 | 示例 |
---|---|---|
G | 纪元标记 | AD |
y | 四位年份 | 2001 |
M | 月份 | July or 07 |
d | 一个月的日期 | 10 |
h | A.M./P.M. (1~12)格式小时 | 12 |
H | 一天中的小时 (0~23) | 22 |
m | 分钟数 | 30 |
s | 秒数 | 55 |
S | 毫秒数 | 234 |
E | 星期几 | Tuesday |
D | 一年中的日子 | 360 |
F | 一个月中第几周的周几 | 2 (second Wed. in July) |
w | 一年中第几周 | 40 |
W | 一个月中第几周 | 1 |
a | A.M./P.M. 标记 | PM |
k | 一天中的小时(1~24) | 24 |
K | A.M./P.M. (0~11)格式小时 | 10 |
z | 时区 | Eastern Standard Time |
' | 文字定界符 | Delimiter |
" | 单引号 | ` |
Date date01 = new Date();
SimpleDateFormat sdf01 = new SimpleDateFormat();
sdf01.applyLocalizedPattern("E");
System.out.println("星期几 : " + sdf01.format(date01));
sdf01.applyLocalizedPattern("D");
System.out.println("一年中的日子 : " + sdf01.format(date01));
3、Calendar
Calendar
类是一个抽象类,它为特定瞬间与一组诸如 YEAR
、MONTH
、DAY_OF_MONTH
、HOUR
等 日历字段
之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
public class Test1 {
public static void main(String arg[]) {
/**
* Calendar字段
*/
Calendar c1 = Calendar.getInstance();
System.out.println(c1.getTime() + "\n"); System.out.println("指示年的 get 和 set 的字段数字 : " + c1.get(Calendar.YEAR));
System.out.println("指示月份的 get 和 set 的字段数字 : " + c1.get(Calendar.MONTH));
System.out.println("get 和 set 的字段数字,指示一个月中的某天 : " + c1.get(Calendar.DATE));
System.out.println("get 和 set 的字段数字,指示上午或下午的小时 : " + c1.get(Calendar.HOUR));
System.out.println("get 和 set 的字段数字,指示一小时中的分钟 : " + c1.get(Calendar.MINUTE));
System.out.println("get 和 set 的字段数字,指示一分钟中的秒 : " + c1.get(Calendar.SECOND) + "\n"); System.out.println("get 和 set 的字段数字,指示当前年中的星期数 : " + c1.get(Calendar.WEEK_OF_YEAR));
System.out.println("get 和 set 的字段数字,指示当前月中的星期数 : " + c1.get(Calendar.WEEK_OF_MONTH) + "\n"); System.out.println("get 和 set 的字段数字,指示当前年中的天数 : " + c1.get(Calendar.DAY_OF_YEAR));
System.out.println("get 和 set 的字段数字,指示一个月中的某天 : " + c1.get(Calendar.DAY_OF_MONTH));
System.out.println("get 和 set 的字段数字,指示一个星期中的某天 : " + c1.get(Calendar.DAY_OF_WEEK) + "\n"); System.out.println("get 和 set 的字段数字,指示上午或下午的小时 : " + c1.get(Calendar.HOUR));
System.out.println("get 和 set 的字段数字,指示一天中的小时 : " + c1.get(Calendar.HOUR_OF_DAY) + "\n"); /**
* Calendar方法
*/
c1.add(Calendar.YEAR, 1);
System.out.println("根据日历的规则,为给定的日历字段添加或减去指定的时间量 : " + c1.getTime());
Calendar c2 = Calendar.getInstance();
System.out.println("判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果 : " + c1.after(c2));
System.out.println("判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果 : " + c1.before(c2));
//c2.clear();
//System.out.println("将此 Calendar 的所日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义 : " + c2.getTime());
//c2.clear(Calendar.YEAR);
//System.out.println("将此 Calendar 的给定日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义 : " + c2.getTime());
System.out.println("比较两个 Calendar 对象表示的时间值(从历元至现在的毫秒偏移量) : " + c1.compareTo(c2));
System.out.println("返回给定日历字段的值 : " + c2.get(Calendar.YEAR));
System.out.println("给定此 Calendar 的时间值,返回指定日历字段可能拥有的最大值 : " + c2.getActualMaximum(Calendar.YEAR));
System.out.println("给定此 Calendar 的时间值,返回指定日历字段可能拥有的最小值 : " + c2.getActualMinimum(Calendar.YEAR));
System.out.println("获取一星期的第一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY : " + c2.getFirstDayOfWeek()); System.out.println("返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象 : " + c2.getTime());
System.out.println("返回此 Calendar 的时间值,以毫秒为单位 : " + c2.getTimeInMillis());
System.out.println("获得时区 : " + c2.getTimeZone().getDisplayName());
c2.roll(Calendar.DATE, 1);
System.out.println("向指定日历字段添加指定(有符号的)时间量,不更改更大的字段 : " + c2.getTime());
c2.set(Calendar.YEAR, 2002);
System.out.println("将给定的日历字段设置为给定值 : " + c2.getTime());
c2.set(1997, 7, 1, 0, 0);
System.out.println(" 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值 : " + c2.getTime());
c2.set(1997, 7, 1, 0, 0, 0);
System.out.println("设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值 : " + c2.getTime());
c2.setTime(new Date());
System.out.println("使用给定的 Date 设置此 Calendar 的时间 : " + c2.getTime());
} }
二、常用的日期处理方法
public class DateUtil { public final static String FORMAT_19 = "yyyy-MM-dd hh:mm:ss";
public final static String FORMAT_10 = "yyyy-MM-dd";
public final static String FORMAT_CN_19 = "yyyy年MM月dd日 hh时mm分ss秒";
public final static String FORMAT_CN_10 = "yyyy年MM月dd日"; /**
* 日期转为指定格式
*/
public static String parsDateToString(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
} /**
* 字符串转换为日期
*/
public static Date parsStringToDate(String formatDate, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date date = null;
try {
date = sdf.parse(formatDate);
} catch (ParseException e) {
System.out.println("输入日期格式不正确,异常信息:" + e);
}
return date;
} /**
* 获得指定日期的前num个月的日期
*/
public static Date beforeMonth(Date date, int num) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(calendar.MONTH, num * -1);
Date dBefore = calendar.getTime();
return dBefore;
} private static Calendar dateToCalendar(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
} /**
* 日期为所在月的第几周
*/
public static int weekOfMonth(Date date) {
return dateToCalendar(date).get(Calendar.WEEK_OF_MONTH);
} /**
* 日期为所在年的第几周
*/
public static int weekOfYear(Date date) {
return dateToCalendar(date).get(Calendar.WEEK_OF_YEAR);
} /**
* 日期为所在年的第几天
*/
public static int dayOfYear(Date date) {
return dateToCalendar(date).get(Calendar.DAY_OF_YEAR);
} /**
* 根据一个时间获取该时间为星期几
*/
public static String dayOfWeek(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("E");
return sdf.format(date);
} /**
* 计算两个时间之间的天数
*/
public static int countDaysBetween(Date d1, Date d2) {
Calendar c1 = dateToCalendar(d1);
Calendar c2 = dateToCalendar(d2);
return Math.abs(Math.abs(c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR)) * 365 + (c1.get(Calendar.DAY_OF_YEAR) - c2.get(Calendar.DAY_OF_YEAR)));
} public static void main(String[] args) {
String formatDate = DateUtil.parsDateToString(new Date(), DateUtil.FORMAT_CN_19);
System.out.println("日期转为指定格式 : " + formatDate);
System.out.println("字符串转换为日期 : " + parsStringToDate(formatDate, DateUtil.FORMAT_CN_19));
System.out.println("获得指定日期的前num个月的日期 : " + beforeMonth(new Date(), 3));
System.out.println("日期为所在月的第几周 : " + weekOfMonth(new Date()));
System.out.println("日期为所在年的第几周 : " + weekOfYear(new Date()));
System.out.println("日期为所在年的第几天 : " + dayOfYear(new Date()));
System.out.println("日期是星期几 : " + dayOfWeek(new Date()));
Calendar c = Calendar.getInstance();
c.set(2017, 10, 25);
System.out.println("计算两个时间之间的天数 : " + countDaysBetween(new Date(), c.getTime())); }
}