黑马程序员---Date、Calendar类

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

 

java.util.Date  日期类

Date 表示特定的瞬间,精确到毫秒。

为了实现国际化,使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃。

剩下的只有这些方法:

构造方法摘要
Date()
          分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
Date(long date)
          分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
 

方法摘要
 booleanafter(Date when)
          测试此日期是否在指定日期之后。
 booleanbefore(Date when)
          测试此日期是否在指定日期之前。
 Objectclone()
          返回此对象的副本。
 intcompareTo(Date anotherDate)
          比较两个日期的顺序。
 booleanequals(Object obj)
          比较两个日期的相等性。
 longgetTime()
          返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
 inthashCode()
          返回此对象的哈希码值。
 voidsetTime(long time)
          设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。
 StringtoString()
          把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中:dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

import java.util.*;
import java.text.*;
class DateDemo 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}

	public static void main(String[] args) 
	{
		Date d = new Date();
		sop(d);
		
		//另一个构造函数演示:
		long l = System.currentTimeMillis();
		Date dl = new Date(l);
		sop(dl);
	}
}


打印结果都是相同的:

这种格式我们是不是有点看不懂啊?我们想要转换成 "yyyy年MM月dd日 星期E HH:mm:ss" 的格式。

这个时候发现大部分方法都已过时,下面就看一下另请参见的内容:

另请参见:
DateFormat, Calendar, TimeZone, 序列化表格

TimeZone是时区,Calendar是日历,DateFormat是时间格式,下面我们就看一下DateFormat:

 

java.text.DateFormat

public abstract class DateFormat

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。

我们发现它有一个方法,能把Date类对象格式化为字符串:

 Stringformat(Date date)
          将一个 Date 格式化为日期/时间字符串。

可是它是抽象类,不能new对象,我们就使用它的已知子类来new一个对象:

 

直接已知子类:
SimpleDateFormat

java.text.SimpleDateFormat

SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。

构造方法
SimpleDateFormat(String pattern)
          用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat

参数:pattern - 描述日期和时间格式的模式。

 

日期和时间模式

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

字母日期或时间元素表示示例
GEra 标志符TextAD
yYear1996; 96
M年中的月份MonthJuly; Jul; 07
w年中的周数Number27
W月份中的周数Number2
D年中的天数Number189
d月份中的天数Number10
F月份中的星期Number2
E星期中的天数TextTuesday; Tue
aAm/pm 标记TextPM
H一天中的小时数(0-23)Number0
k一天中的小时数(1-24)Number24
Kam/pm 中的小时数(0-11)Number0
ham/pm 中的小时数(1-12)Number12
m小时中的分钟数Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zonePacific Standard Time; PST; GMT-08:00
Z时区RFC 822 time zone-0800

模式字母通常是重复的,其数量确定其精确表示。

演示:

DateFormat和其子类属于java.text包,因为日期最终是文本格式的,别忘了导text包:

import java.util.*;
import java.text.*;
class DateDemo 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}

	public static void main(String[] args) 
	{
		Date d = new Date();
		sop(d);//打印的时间看不懂,希望有些格式。

		//将模式封装到SimpleDateformat对象中。
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E HH:mm:ss");

		//调用format方法让模式格式化指定Date对象。
		String time = sdf.format(d);

		sop(time);
	}
}


还有人说,我不想把时间格式化,我只想获取其中的年或者日期怎么办?

使用老方法:

import java.util.*;
import java.text.*;
class CalendarDemo 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		Date d = new Date();
		sop(d);

		//只想获取年,用格式化方法只格式化年:
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");

		String year = sdf.format(d);//返回的是字符串,不方便做运算
		sop(year+"年");//可以使用Integer.parseInt(String)转换,不过比较麻烦。
	}
}

返回的是字符串,不方便做运算。可以使用Integer.parseInt(String)转换,不过比较麻烦。

Date里面有getYear方法,已过时,不过已经告诉你在新的类中:

 int

getDate()

          已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.DAY_OF_MONTH) 取代。

 int

getDay()

          已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.DAY_OF_WEEK) 取代。

 intgetHours() 
          已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.HOUR_OF_DAY) 取代。
 intgetMinutes() 
          已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.MINUTE) 取代。
 intgetMonth() 
          已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.MONTH) 取代。
 intgetSeconds() 
          已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.SECOND) 取代。
 intgetYear() 
          已过时。 从 JDK 1.1 开始,由 Calendar.get(Calendar.YEAR) - 1900 取代。
 intgetTimezoneOffset()
          已过时。 从 JDK 1.1 开始,由 -(Calendar.get(Calendar.ZONE_OFFSET) + Calendar.get(Calendar.DST_OFFSET)) / (60 * 1000) 取代。

java.util.Calendar

public abstract class Calendar  是个抽象类:

可以使用已知子类去new对象:

直接已知子类:
GregorianCalendar
 

也可以使用类中提供的方法来获取一个实例:

static CalendargetInstance()
          使用默认时区和语言环境获得一个日历。
static CalendargetInstance(Locale aLocale)
          使用默认时区和指定语言环境获得一个日历。
static CalendargetInstance(TimeZone zone)
          使用指定时区和默认语言环境获得一个日历。

import java.util.*;
import java.text.*;
class CalendarDemo 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		Calendar c = Calendar.getInstance();
		sop(c);
	}
}

返回来的Calendar其实就是GregorianCalendar对象:

 

Calendar有很多字段,如:

static intYEAR
          指示年的 getset 的字段数字。

get方法:

 intget(int field)
          返回给定日历字段的值。

参考上图:得知各字段取值。

import java.util.*;
import java.text.*;
class CalendarDemo 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		/*
		Date d = new Date();
		sop(d);

		//只想获取年,用格式化方法只格式化年:
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");

		String year = sdf.format(d);//返回的是字符串,不方便做运算
		sop(year+"年");//可以使用Integer.parseInt(String)转换,不过比较麻烦。
		*/

		Calendar c = Calendar.getInstance();

		sop(c.get(Calendar.YEAR)+"年");

		String[] month = {"一月","二月","三月","四月",
			"五月","六月","七月","八月","九月","十月",
			"十一月","十二月"};//MONTH字段的值是从0~11,使用查表法。
		sop(month[c.get(Calendar.MONTH)]);

		sop(c.get(Calendar.DAY_OF_MONTH)+"日");

		String[] week = {" ","星期日","星期一","星期二","星期三","星期四",
			"星期五","星期六"};//DAY_OF_WEEK字段的值是从1~7,使用查表法。
		sop(week[c.get(Calendar.DAY_OF_WEEK)]);
	}
}


 

除了get获取时间外,还可以通过set方法来设置值:

 voidset(int field, int value)
          将给定的日历字段设置为给定值。
 voidset(int year, int month, int date)
          设置日历字段 YEARMONTHDAY_OF_MONTH 的值。
 voidset(int year, int month, int date, int hourOfDay, int minute)
          设置日历字段 YEARMONTHDAY_OF_MONTHHOUR_OF_DAYMINUTE 的值。
 voidset(int year, int month, int date, int hourOfDay, int minute, int second)
          设置字段 YEARMONTHDAY_OF_MONTHHOURMINUTESECOND 的值。

import java.util.*;
import java.text.*;
class CalendarDemo2 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		Calendar c = Calendar.getInstance();
		c.set(2014,3,28); //这里写3代表四月。
		printCalendar(c);

	}
	public static void printCalendar(Calendar c)
	{
		sop(c.get(Calendar.YEAR)+"年");

		String[] month = {"一月","二月","三月","四月",
			"五月","六月","七月","八月","九月","十月",
			"十一月","十二月"};//MONTH字段的值是从0~11,使用查表法。
		sop(month[c.get(Calendar.MONTH)]);

		sop(c.get(Calendar.DAY_OF_MONTH)+"日");

		String[] week = {" ","星期日","星期一","星期二","星期三","星期四",
			"星期五","星期六"};//DAY_OF_WEEK字段的值是从1~7,使用查表法。
		sop(week[c.get(Calendar.DAY_OF_WEEK)]);
	}
}


 

我现在想把时间往后推两年:

abstract  voidadd(int field, int amount) //参数(字段,偏移量)
          根据日历的规则,为给定的日历字段添加或减去指定的时间量。

import java.util.*;
import java.text.*;
class CalendarDemo2 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		Calendar c = Calendar.getInstance();
		
		c.add(Calendar.YEAR,2);
		c.add(Calendar.MONTH,-2);
		c.add(Calendar.DAY_OF_MONTH,-20);
		printCalendar(c);

	}
	public static void printCalendar(Calendar c)
	{
		sop(c.get(Calendar.YEAR)+"年");

		String[] month = {"一月","二月","三月","四月",
			"五月","六月","七月","八月","九月","十月",
			"十一月","十二月"};//MONTH字段的值是从0~11,使用查表法。
		sop(month[c.get(Calendar.MONTH)]);

		sop(c.get(Calendar.DAY_OF_MONTH)+"日");

		String[] week = {" ","星期日","星期一","星期二","星期三","星期四",
			"星期五","星期六"};//DAY_OF_WEEK字段的值是从1~7,使用查表法。
		sop(week[c.get(Calendar.DAY_OF_WEEK)]);
	}
}

 

两个练习:
1,获取任意年的二月有多少天。
 思路:根据指定年设置一个时间就是
 c.set(year,2,1)//某一年的3月1日。
 c.add(Calenar.DAY_OF_MONTH,-1);//3月1日,往前推一天,就是2月最后一天。

 

2,获取昨天的现在这个时刻。
 c.add(Calenar.DAY_OF_MONTH,-1);


 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值