Java处理时间和日期

1 相关类

1.1 java.util.Date

Date类 表示特定的瞬间,精确到毫秒。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串。Date 中的把日期解释为年、月、日、小时、分钟和秒值的方法已废弃。

1.2 java.text.DateFormat(抽象类)

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、分析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年,1 月 1 日 00:00:00 这一刻开始的毫秒数。

1.3 java.text.SimpleDateFormat(DateFormat的直接子类)

SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化(日期 -> 文本)、分析(文本 -> 日期)和规范化。
SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来新的创建日期-时间格式化程序。

1.4 java.util.Calendar(抽象类)

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。

1.5 java.util.GregorianCalendar(Calendar的直接子类)

GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统。
GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家是在 1582 年 10 月 15 日创立,在其他国家要晚一些)。可由调用方通过调用 setGregorianChange() 来更改起始日期。

2 相关类的具体使用

2.1 java.util.Date的使用

2.1.1 构造函数

/**
*分配 Date 对象并用当前时间初始化此对象,以表示分配它的时间(精确到毫秒)。
*/
Date()

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

2.1.2 方法摘要

boolean after(Date when)
          测试此日期是否在指定日期之后。
 
 boolean before(Date when)
          测试此日期是否在指定日期之前。
 
 Object clone()
          返回此对象的副本。
 
 int compareTo(Date anotherDate)
          比较两个日期的顺序。
 
 boolean equals(Object obj)
          比较两个日期的相等性。
 
 long getTime()
          返回自 19701100:00:00 GMT 以来此 Date 对象表示的毫秒数。
 
 int hashCode()
          返回此对象的哈希码值。
 
 void setTime(long time)
          设置此 Date 对象,以表示 19701100:00:00 GMT 以后 time 毫秒的时间点。
 
 String toString()
          把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中:
          dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
          mon 是月份 (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)。
          dd 是一月中的某一天(0131),显示为两位十进制数。
          hh 是一天中的小时(0023),显示为两位十进制数。
          mm 是小时中的分钟(0059),显示为两位十进制数。
          ss 是分钟中的秒数(0061),显示为两位十进制数。
          zzz 是时区(并可以反映夏令时)。标准时区缩写包括方法 parse 识别的时区缩写。如果不提供时区信息,则 zzz 为空,即根本不包括任何字符。
          yyyy 是年份,显示为 4 位十进制数。

2.1.4 示例

Date date = new Date();
System.out.println(date);
System.out.println(date.getTime());

2.2 java.text.SimpleDateFormat的使用

2.2.1 模式表

字母 日期或时间元素 表示 示例
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

2.2.2 示例

// 将日期转化为指定的格式
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatDate = format.format(date);
System.out.println(formatDate);

2.3 java.util.Calendar类

2.3.1 需要注意一些地方

1、Calendar的星期是从周日开始的,常量值为0。
2、Calendar的月份是从一月开始的,常量值为0。
3、Calendar的每个月的第一天值为1

2.4 java.util.GregorianCalendar(Calendar的直接子类)

GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统

2.4.1 创建Calendar的方式

Calendar now1 = Calendar.getInstance();
Calendar now2 = new GregorianCalendar();
Calendar now3 = new GregorianCalendar(2016, 01, 24);
Calendar now4 = new GregorianCalendar(2016, 01, 24, 15, 55);      //陷阱:Calendar的月份是0~11 
Calendar now5 = new GregorianCalendar(2016, 01, 24, 15, 55, 44);
Calendar now6 = new GregorianCalendar(Locale.US);
Calendar now7 = new GregorianCalendar(TimeZone.getTimeZone("GMT-8:00"));

2.4.2 输出指定格式的日期

SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒 E", Locale.CHINA);
System.out.println("获取日期中文格式化化输出:" + df.format(now1.getTime()));

2.4.3 通过Calendar获取日期中年月日等相关信息

System.out.println("获取年:" + now5.get(Calendar.YEAR));
System.out.println("获取月(月份是从0开始的):" + now5.get(Calendar.MONTH));
System.out.println("获取日:" + now5.get(Calendar.DAY_OF_MONTH));
System.out.println("获取时:" + now5.get(Calendar.HOUR));
System.out.println("获取分:" + now5.get(Calendar.MINUTE));
System.out.println("获取秒:" + now5.get(Calendar.SECOND));
System.out.println("获取上午、下午:" + now5.get(Calendar.AM_PM));
System.out.println("获取星期数值(星期是从周日开始的):" + now5.get(Calendar.DAY_OF_WEEK));

2.4.4 通用星期中文化转换

String dayOfWeek[] = {"", "日", "一", "二", "三", "四", "五", "六"};
System.out.println("now对象的星期是:" + dayOfWeek[now.get(Calendar.DAY_OF_WEEK)]);

2.4.5 通用月份中文化转换

String months[] = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"};
System.out.println("now5对象的月份是: " + months[now5.get(Calendar.MONTH)]);

2.4.6 示例

 //获取当前月份的最大天数
Calendar cal = Calendar.getInstance();
int maxday=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
int minday=cal.getActualMinimum(Calendar.DAY_OF_MONTH);
System.out.println(maxday);
//取当月的最后一天  
DateFormat formatter3=new SimpleDateFormat("yyyy-MM-"+maxday);
System.out.println(formatter3.format(cal.getTime()));
//取当月的最后一天  
DateFormat formatter4=new SimpleDateFormat("yyyy-MM-"+minday);
System.out.println(formatter4.format(cal.getTime()));
//求两个日期之间相隔的天数
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=(endDate.getTime()-beginDate.getTime())/(24*60*60*1000);
System.out.println("相隔的天数="+day);
//一年前的日期
java.text.Format formatter5=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=formatter5.format(todayDate);
System.out.println(beforeDate);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR, -1);
System.out.println(formatter5.format(calendar.getTime()));
//当前星期的星期一和星期日
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
GregorianCalendar gregorianCalendar = new GregorianCalendar();
int dayInWeek = gregorianCalendar.get(Calendar.DAY_OF_WEEK);
int offset = 0;
if (dayInWeek == 1) {
// 星期天
offset = 6;
} else {
// 星期一至星期六
offset = dayInWeek - 2;
}
gregorianCalendar.add(GregorianCalendar.DAY_OF_MONTH, -offset);
String sday = dateFormat.format(gregorianCalendar.getTime());
gregorianCalendar.add(GregorianCalendar.DAY_OF_MONTH, 6);
String eday = dateFormat.format(gregorianCalendar.getTime());

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

3 计算那个时间的时间差

Instant start  = Instant.now();
for (int i = 0; i < 10000; i++) {
	System.out.println("0");
}
Instant end  = Instant.now();

Duration timeElapsed = Duration.between(start, end);
long millis = timeElapsed.toMillis();
System.out.println(millis);

4 日期调整器

对于日程安排应用来说,经常需要计算诸如“每个月的第一个星期二”这样的日期。Temporal Adjusters类提供了大量用于常见调整的静态方法。你可以将调整方法的结果传递给with方法。例如,某个月的第一个星期二可以像下面这样计算:

Local Date firstTuesday = Local Date.of(year, month, l).with(
Temporal Adjusters.nextOrSame(DayOfWeek.TUESDAY));

一如既往,with方法会返回一个新的LocalDate对象,而不会修改原来的对象。下表展示了可用的调整器。

方 法 描 述
next(weekday), prevlous(weekday) 下一个或上一个给定的星期日期
nextOrSame(weekday),
previousOrSame(weekday)
从绐定的H期幵始的下一个或上一个给定的M期H期
dayOfWeeKInMonth(n, weekday) 月份中的第n个weekday
lastInMonth(weekday) 月份中的最后一个weekday
firstDayOfMonth()
firstDayOfNextMonth(),
firstDayOfNextYear()
firstDayOfMonth(),
lastDayOfYear()
方法名所描述的口期

你可能感兴趣的:(Java)