【java学习笔记十七】日期类及其处理

Date类

1. 概述

Date类是表示特定时间点的对象,精确到毫秒。
As of JDK 1.1, the Calendar class should be used to convert between dates and time fields and the DateFormat class should be used to format and parse date strings. The corresponding methods in Date are deprecated.
JDK1.1及更新版本,应使用Calendar类来转换时间和日期,而DateFormat类来格式化日期或解析关于日期的字符串。此时Date类中相应的方法将被废弃。

2. 构造器

  • 以当前时间创建对象
    Date()
  • 以指定纪元时间创建对象
    Date(long date)

3. 常用方法

  • 判断时间点的先后
    boolean  after(Date when)
    boolean  before(Date when)
  • 获取或设置纪元时间
    long  getTime()
    void  setTime(long time)

4. 示例

Date date = new Date(1420000000000l);  // 纪元毫秒时间转换日期对象
long millisTime = date.getTime();  // 日期对象转换纪元毫秒时间

Calendar类

1. 概述

  • Calendar类是个日历表示法的抽象类,可以通过其静态方法获取当前时间日期的对象
  • Calendar类维护了非常多的字段,可以提供关于日历的各种信息以及转换方法。
  • 实际上,通过静态方法获得的Calendar对象为其子类GregorianCalendar对象,所以也可以直接创建其子类对象进行处理。

2. 常用字段

  • 年,月,日
    YEAR,MONTH,DAY_OF_MONTH/DATE
  • 时,分,秒,毫秒
    HOUR_OF_DAY,MINUTE,SECOND,MILLISECOND
  • 本周星期几,本年第几天,本月第几周,本月第几个7天,本年第几周
    DAY_OF_WEEK,DAY_OF_YEAR,WEEK_OF_YEAR,DAY_OF_WEEK_IN_MONTH,WEEK_OF_YEAR
  • 公元,上下午
    ERA,AM_PM
  • 12小时计时
    HOUR
  • 星期(DAY_OF_WEEK取值范围)
    SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY
  • 月份(MONTH取值范围,其中JANUARY为0)
    JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER
3. 常用方法
  • 使用当前日期时间以及默认时区本地化获取日历对象
    static Calendar  getInstance();
  • 获取/设置当前日历的时间
    Date  getTime()
    void  setTime(Date date)
  • 按毫秒单位时间设置日历时间
    void  setTimeInMillis(long millis)
  • 获取指定字段的值
    int  get(int field)
  • 更改指定字段的值
    void  set(int field, int value);
    void  set(int year, int month, int date)
    void  set(int year, int month, int date, int hourOfDay, int minute)
    void  set(int year, int month, int date, int hourOfDay, int minute, int second)
  • 按给定的偏移更改当前日期时间
    abstract void  add(int field, int amount)
  • 获取该日期指定字段的最大值或最小。
    int  getActualMaximum(int field)
    int  getActualMinimum(int field)
  • 获取/设置每周第一天是星期几
    int  getFirstDayOfWeek()
    void  setFirstDayOfWeek(int value)
4. 示例

Calendar cal = Calendar.getInstance();  // 以当前日期时间初始化日历

cal.set(Calendar.MONTH, Calendar.DECEMBER);  // 设置日历为十一月

int month = cal .get(Calendar.MONTH);  // 获取日信息

int maxMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 获取当前日期月的天数。

System.out.println( “月:” + (month + 1) + “\n该月天数” + maxMonth);

5. 子类:GregorianCalendar类

  • 可以直接new该类对象完成日历功能的使用。
  • GregorianCalendar类扩展了Calendar类的功能,可以直接通过年月日时分秒的方式创建对象。
    GregorianCalendar()
    GregorianCalendar(int year, int month, int dayOfMonth)
    GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute)
    GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second)
  • GregorianCalendar类提供了世界上大多数历法表示方法。
  • GregorianCalendar类提供了判断闰年的方法
    boolean  isLeapYear(int year)

DateFormat类

1. 概述

  • FormateDemo类,该类为抽象类,但是提供了Instance方法可以实现标准样式的格式化和解析。
  • 和Calendar类类似,如需要自定义样式可以使用其子类SimpleDateFormat。

2. 字段

  • SHORT    yy-M-d 上午/下午h:mm
  • MEDIUM   yyyy-M-d h:mm:ss
  • LONG     yyyy年M月d日 上午/下午hh时mm分ss秒
  • FULL     yyyy年M月d日 星期 上午/下午hh时mm分ss秒 CST
3. 方法
  • 按指定标准样式初始化DateFormat对象
    static DateFormat    getInstance();           // 默认风格SHORT
    static DateFormat    getDateInstance();       // 默认风格MEDIUM
    static DateFormat    getTimeInstance();       // 默认风格MEDIUM
    static DateFormat    getDateTimeInstance();   // 默认风格MEDIUM
  • 将日期对象按指定标准样式转化为字符串
    String    format(Date date);
  • 将字符串按指定标准样式解析为日期对象
    Date    parse(String source);
4. 示例

Date date = new Date(1391234567891l);

// 指定标准样式

DateFormat dateStaFormat = DateFormat.getDateTimeInstance(DateFormat. LONG, DateFormat.MEDIUM );

String date_Sta_str = dateStaFormat.format(date ); // 格式化,2014年2月1日 14:02:47

 

String dateTime = “2014年11月15日 14:16:50”;

try {

Date nowDateTime = dateStaFormat.parse(dateTime ); // 解析,Sat Nov 15 14:16:50 CST 2014

long millisTime = nowDateTime.getTime(); // 1416032210000

catch (ParseException e) {

e.printStackTrace();

}

SimpleDateFormat类

1. 概述

  • SimpleDateFormat类是DateFormat的子类,和Calendar类似,DateFormat类通过工厂方法获得的对象就是SimpleDateFormat类对象。
  • SimpleDateFormat类可以按指定样式创建对象,可以自定义日期时间的格式。

2. 日期和时间模式

其中,未加”的字母将被识别为模式,所以非匹配字母需要加”以示区分。
Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 199696
Y Week year Year 200909
M Month in year (context sensitive) Month JulyJul07
L Month in year (standalone form) Month JulyJul07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day name in week Text TuesdayTue
u Day number of week (1 = Monday, …, 7 = Sunday) Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard TimePSTGMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08-0800-08:00
示例
Date and Time Pattern Result
"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
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"     2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u" 2001-W27-3

3. 构造器

SimpleDateFormat()
SimpleDateFormat(String pattern)
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)
SimpleDateFormat(String pattern, Locale locale)

4. 常用方法

更换指定样式
void  applyPattern(String pattern)

5. 示例

Date date = new Date(1391234567891l);

// 指定样式

SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy/MM/dd ‘at’ HH:mm:ss.SSS” );

String date_str = dateFormat.format( date);  // 格式化,2014/02/01 at 14:02:47.891

 

dateFormat.applyPattern(“yyyy.MM.dd” );  // 更换样式

String dateTime = “2014.11.15”;

try {

Date nowDateTime = dateFormat.parse( dateTime); // 解析,Sat Nov 15 00:00:00 CST 2014

catch (ParseException e) {

e.printStackTrace();

}

Date,Calendar和DateFormat的关系

1. Date和Calendar可以相互转换。
2. Date和DateFormat配合格式化和解析。
3. 也就是说Date可以作为桥梁存在。
4. 示例

package date;

 

import java.text.DateFormat;

import java.text.ParseException;

import java.util.Calendar;

import java.util.Date;

 

 

public class GregorianCalendarDemo {

 

public static void main(String[] args) throws ParseException {

Date date = new Date();

Calendar cal = Calendar.getInstance();

DateFormat df = DateFormat.getInstance();

 

// 1. Date <-> Calendar

Calendar date2cal = Calendar.getInstance();

date2cal.setTime( date);

Date cal2date = cal.getTime();

 

// 2. Date <-> DateFormat

String time = df.format(date); // “14-12-16 下午11:47”

Date df2date = df.parse( time); // Tue Dec 16 23:48:00 CST 2014

}

}

案例

1. 时间转换和简单计算

package date;

 

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

 

public class DateText {

 

public static void main(String[] args) {

/*

     * 1. 将毫秒时间转换为指定日期格式: xxxx年x月x日  h:m:s

     * 2. “2014/11/11″转成日期对象。

     * 3. “2014-11-11″到”2015年4月29日”到底有多少天?

     * 4. 获取给定年份到现在每年的2月有多少天?

     */

 

// 1. 将毫秒时间转换为指定日期格式: xxxx年x月x日  h:m:s

Date date = new Date(1400000000000l);

DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat. LONG, DateFormat.MEDIUM );

String dateString = dateFormat.format( date);

System.out.println( dateString);

 

// 2. “2014/11/11″转成日期对象。

SimpleDateFormat sDateFormat = new SimpleDateFormat(“yyyy/MM/dd” );

try {

date = sDateFormat.parse( “2014/11/11”);

System.out.println( date);

catch (ParseException e) {

System.out.println( “解析错误!” );

e.printStackTrace();

}

 

// 3. “2014-11-11″到”2015年4月29日”到底有多少天?

String dateString1 = “2014-11-11”;

String dateString2 = “2015年4月29日” ;

int dateStyle1 = DateFormat. MEDIUM;

int dateStyle2 = DateFormat. LONG;

int days;

try {

days = calculateDays(dateString1 , dateStyle1 , dateString2, dateStyle2 );

System.out.println( dateString1 + ” 到 “ + dateString2 + ” 间有 “ + days + ” 天” );

catch (ParseException e) {

System.out.println( “解析错误!” );

e.printStackTrace();

}

 

// 4. 获取给定年份到现在每年的2月有多少天,最后一天星期几?

int year = 1989;

int endYear = Calendar.getInstance().get(Calendar. YEAR);

for (; year <= endYear; year++) {

show(year );

}

 

}

 

public static void show(int year) {

Calendar cal = Calendar.getInstance();

cal.set(year, 21);

cal.add(Calendar. DAY_OF_MONTH, –1);

System.out.println( year + “年 二月包含 “ + cal.get(Calendar.DAY_OF_MONTH) + ” 天,最后一天是 “

+ getDayInWeek(cal .get(Calendar.DAY_OF_WEEK)));

}

 

public static String getDayInWeek(int dayOfWeek) {

if (dayOfWeek < 1 || dayOfWeek > 7) {

throw new RuntimeException( dayOfWeek + ” : 没有对应的星期!” );

}

String[] week = {“”“星期日”“星期一” , “星期二 “ , “星期三” , “星期四” , “星期五 “ , “星期六” };

return week[ dayOfWeek];

}

 

public static int calculateDays(String dateString1, int dateStyle1, String dateString2 ,

int dateStyle2) throws ParseException {

long dateMillis1 = DateFormat.getDateInstance(dateStyle1).parse( dateString1).getTime();

long dateMillis2 = DateFormat.getDateInstance(dateStyle2).parse( dateString2).getTime();

long margin = Math.abs(dateMillis1 – dateMillis2 );

return ( int) ( margin/1000/60/60/24);

}

}

2. 打印当月的日历,今天用*标注

package date;

 

import java.text.DateFormatSymbols;

import java.util.Calendar;

 

public class CalendarTest {

 

public static void main(String[] args) {

// 打印当月的日历

Calendar cal = Calendar.getInstance();

 

// 获取今天日期和月份

int today = cal.get(Calendar. DAY_OF_MONTH);

int month = cal.get(Calendar. MONTH);

 

// 将日历指向本月第一天

cal.set(Calendar. DAY_OF_MONTH, 1);

 

// 本月第一天是星期几,以及一周的第一天是星期几

int weekday = cal.get(Calendar. DAY_OF_WEEK);

int firstDayOfWeek = cal.getFirstDayOfWeek();

 

// 判断日历第一行第一列是哪一天

int daysInLastMonth = 0;

while ( weekday != firstDayOfWeek) {

// 如果本月第一天不是一周的第一天,那么日历指向前一天

daysInLastMonth++;

cal.add(Calendar. DAY_OF_MONTH, –1);

weekday = cal.get(Calendar. DAY_OF_WEEK);

}

 

// 打印星期名

String[] weekdayName = new DateFormatSymbols().getWeekdays();

do {

System.out.printf( “%6s”, weekdayName [weekday ]);

cal.add(Calendar. DAY_OF_MONTH, 1);

weekday = cal.get(Calendar. DAY_OF_WEEK);

while ( weekday != firstDayOfWeek);

System.out.println();

 

// 打印第一行属于上个月日期的空格

for (int i = 0; i < daysInLastMonth; i++) {

System.out.print( ”      “ );

}

 

// 打印日期

cal.set(Calendar. DAY_OF_MONTH, 1);

while ( month == cal.get(Calendar. MONTH)) {

int day = cal.get(Calendar. DAY_OF_MONTH);

System.out.printf( “%5d”, day );

 

// 如果是今天,则打印*

if (day == today) {

System. out.print(“*” );

else {

System. out.print(” “ );

}

 

// 日历步进

cal.add(Calendar. DAY_OF_MONTH, 1);

weekday = cal.get(Calendar. DAY_OF_WEEK);

 

// 如果一行结束,加入换行符

if (weekday == firstDayOfWeek) {

System. out.println();

}

}

 

// 如果该月结束不在一行的末尾,则加入一换行符

if (weekday != firstDayOfWeek) {

System.out.println();

}

}

}

发表评论

电子邮件地址不会被公开。 必填项已用*标注