java基础知识(六)日期处理
一、日期处理类
在 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())); } }