Java 日期的各种操作


一、Java中的日期概述
日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题。
在Java中,操作日期主要涉及到一下几个类:
1、java.util.Date
        类 Date 表示特定的瞬间,精确到毫秒。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串。Date 中的把日期解释为年、月、日、小时、分钟和秒值的方法已废弃。
 
2、java.text.DateFormat(抽象类)
        DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、分析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年,1 月 1 日 00:00:00 这一刻开始的毫秒数。
 
3、java.text.SimpleDateFormat(DateFormat的直接子类)
        SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化(日期 -> 文本)、分析(文本 -> 日期)和规范化。
        SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来新的创建日期-时间格式化程序。
 
4、java.util.Calendar(抽象类)
        Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
        与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。
 
5、java.util.GregorianCalendar(Calendar的直接子类)
        GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统。
        GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家是在 1582 年 10 月 15 日创立,在其他国家要晚一些)。可由调用方通过调用 setGregorianChange() 来更改起始日期。


二、Java中的日期的格式化:

一般常用格式化类DateFormat和SimpleDateFormat的format(Date time)方法进行格式化日期.

一、Java中的日期概述

1. 首先介绍java.text.SimpleDateFormat类.

public class SimpleDateFormat extends DateFormat

SimpleDateFormat

是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstancegetDateInstancegetDateTimeInstance 来创建日期-时间格式器。每一个这样的类方法都能够返回一个以默认格式模式初始化的日期/时间格式器。可以根据需要使用 applyPattern 方法来修改格式模式。
日期和时间模式

日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母 'A''Z''a''z' 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来,以免进行解释。"''" 表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。

定义了以下模式字母(所有其他字符 'A''Z''a' 'z' 都被保留):

字母 日期或时间元素 表示 示例
G Era 标志符 Text AD
y Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800

示例

以下示例显示了如何在美国语言环境中解释日期和时间模式。给定的日期和时间为美国太平洋时区的本地时间 2001-07-04 12:08:56。
日期和时间模式 结果
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
/**
 * @author lyg
 * @Date 2015年12月27日上午10:45:36
 */
public class DateConstant {
	public final static String YEAR_MONTH_DAY="yyyy-MM-dd"; //年-月-日
	public final static String YEAR_MONTH_DAY__TIME="yyyy-MM-dd hh:mm:ss"; //年月日时分秒;
}

/**
 * 操作日期时间
 * 
 * @author lyg
 * @date 2015年12月27日
 */
public class DateUtil {
	public static void main(String[] args) {
		Date date=new Date();
		System.out.println(getDateFormat(DateConstant.YEAR_MONTH_DAY__TIME, date));
	}
	/**
	 * 返回日期字符串格式
	 * 示例2015年12月27日
	 */
	public static String getDateFormatLong(Date date){
		DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.LONG);
		return dateFormat.format(date);
	}
	/**
	 * 返回日期字符串格式
	 * 示例15-12-27
	 */
	public static String getDateFormatDefault(Date date){
		DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.DEFAULT);
		return dateFormat.format(date);
	}
	/**
	 * 返回日期字符串格式
	 * 示例2015-12-27
	 */
	public static String getDateFormatShort(Date date){
		DateFormat dateFormat=DateFormat.getDateInstance(DateFormat.SHORT);
		return dateFormat.format(date);
	}
	/**
	 * 返回日期字符串格式
	 * 示例 
	 */
	public static String getDateFormat(String pattern,Date date){
		 SimpleDateFormat sFormat = new SimpleDateFormat(pattern);
		return sFormat.format(date);
	}
2.Java中的日期概述

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。 

常用的日期类有Calendar和GregorianCalendar,后者是前者的子类,并拓展了一些功能,例如是否为闰年等方法.两者用法基本类似

public static void main(String[] args) {
		Date date=new Date();
		Calendar cal = Calendar.getInstance();// 取当前日期。
		System.out.println(getDateFormat(DateConstant.YEAR_MONTH_DAY__TIME, cal.getTime()));
	}
/**
	 * return Date
	 * 操作日期 param1 参入的日期,parem2 操作符号 param 3增加的天数
	 */
	public static Date addDateFormat(Calendar cal,String flag,Integer day){
		if("+".equals(flag)){
			cal.add(Calendar.DAY_OF_MONTH, day);
			return cal.getTime();
		}
		if("-".equals(flag)){
			cal.add(Calendar.DAY_OF_MONTH, -day);
			return cal.getTime();
		}
		return cal.getTime();
	}
面试题:

下面整理几个有关于日期和时间操作的一些面试题;

获取当前月份的最大天数

Calendar cal = Calendar.getInstance();   
int day=cal.getActualMaximum(Calendar.DAY_OF_MONTH);   
System.out.println(day); 

取当月的最后一天

Calendar cal = Calendar.getInstance();   
int maxDay=cals.getActualMaximum(Calendar.DAY_OF_MONTH);   
java.text.Format formatter3=new java.text.SimpleDateFormat("yyyy-MM-"+maxDay);   
System.out.println(formatter3.format(cal.getTime()));

取当月的第一天

java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-01");   
java.util.Date firstDay=new java.util.Date();   
System.out.println("the month first day is "+formats.format(firstDay)); 

求两个日期之间相隔的天数

java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");   
java.util.Date beginDate= format.parse("2007-12-24");   
java.util.Date endDate= format.parse("2007-12-25");   
long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);   
System.out.println("相隔的天数="+day); 

一年前的日期

java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");   
java.util.Date todayDate=new java.util.Date();   
long beforeTime=(todayDate.getTime()/1000)-60*60*24*365;   
todayDate.setTime(beforeTime*1000);   
String beforeDate=formatter.format(todayDate);   
System.out.println(beforeDate);

一年后的日期

java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");   
java.util.Date todayDate=new java.util.Date();   
long afterTime=(todayDate.getTime()/1000)+60*60*24*365;   
todayDate.setTime(afterTime*1000);   
String afterDate=formatter.format(todayDate);   
System.out.println(afterDate);  

10小时后的时间 

java.util.Calendar Cal=java.util.Calendar.getInstance();   
Cal.setTime(dateOper);   
Cal.add(java.util.Calendar.HOUR_OF_DAY,10);   
System.out.println("date:"+forma.format(Cal.getTime()));  

10小时前的时间 

java.util.Calendar Cal=java.util.Calendar.getInstance();   
Cal.setTime(dateOper);   
Cal.add(java.util.Calendar.HOUR_OF_DAY,-10);   
System.out.println("date:"+forma.format(Cal.getTime()));  

当前日期的星期一和星期天

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
GregorianCalendar cal = new GregorianCalendar();


int dayInWeek = cal.get(Calendar.DAY_OF_WEEK);
int offset = 0;
if (dayInWeek == 1) {
    // 星期天
    offset = 6;
} else {
    // 星期一至星期六
    offset = dayInWeek - 2;
}
cal.add(GregorianCalendar.DAY_OF_MONTH, -offset);
String sday = dateFormat.format(cal.getTime());
cal.add(GregorianCalendar.DAY_OF_MONTH, 6);
String eday = dateFormat.format(cal.getTime());

System.out.println("这个星期的星期一:" + sday);
System.out.println("这个星期的星期天:" + eday);

获取当前日期所在的星期属于今年的第几周

GregorianCalendar cal = new GregorianCalendar();
int weekOfYear = cal.get(Calendar.WEEK_OF_YEAR);
System.out.println("这个星期属于第几周:" + weekOfYear);

总结
Java中日期的经常有一下五个方面:
1、创建日期
2、日期格式化显示
3、日期的转换(主要是和字符串之间的相互转换)
4、日期中年、月、日、时、分、秒、星期、月份等获取。
5、日期的大小比较、日期的加减。

你可能感兴趣的:(Java 日期的各种操作)