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 | 1996 ; 96 |
Y | Week year | Year | 2009 ; 09 |
M | Month in year (context sensitive) | Month | July ; Jul ; 07 |
L | Month in year (standalone form) | Month | July ; Jul ; 07 |
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 | Tuesday ; Tue |
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 Time ; PST ; GMT-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)
SimpleDateFormat(String pattern)
SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols)
SimpleDateFormat(String pattern, Locale locale)
4. 常用方法
更换指定样式
void applyPattern(String pattern)
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, 2, 1);
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();
}
}
}