Java提供java.util.Date类来对日期和时间的系统消息进行封装,而提供java.util.Calendar类将根据默认的日历系统来解释Date对象。
Date
Date对象表示的默认顺序是:星期、月、日、小时、分、秒、年,例如:
@Test public void test01() { Date date = new Date(); System.out.println(date); }
输出结果为:
Sun Aug 18 17:12:51 CST 2013
这种顺序很不符合中国人的习惯,因此可以自定义日期格式,需要用到的类是DateFormat。
@Test public void test02() { Date date = new Date(); // DateFormat是抽象类,需要使用其子类 SimpleDateFormat创建对象。 DateFormat df = new SimpleDateFormat("yyyy年M月dd日E"); String dateStr = df.format(date); System.out.println(dateStr); }
输出结果为:
2013年8月18日星期日
格式参数可以参照api文档,这里也贴上来以供参考。
字母 | 日期或时间元素 | 表示 | 示例 |
---|---|---|---|
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 |
Calendar
Calendar是一个抽象类,可以使用getInstance()方法获得对象。
private String[] dom = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六","星期日" }; /*这里有个诡异的现象,我做这个实验的时候是星期日,第一次做这个实验时我的dom数组是 private String[] dom = { "星期日" ,"星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; 原因是cal.get(Calendar.DAY_OF_WEEK)返回了1,但是做了多次实验后cal.get(Calendar.DAY_OF_WEEK)变成返回7了,我推测是 使用GregorianCalendar时改变了我系统的日期格式。 */ @Test public void test03() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, -1); StringBuffer sb = new StringBuffer(); sb.append(cal.get(Calendar.YEAR) + "年") .append((cal.get(Calendar.MONTH) + 1) + "月") // 月份从0~12 .append(cal.get(Calendar.DAY_OF_MONTH) + "日") .append(dom[cal.get(Calendar.DAY_OF_WEEK)-1]); System.out.println(sb); }
输出结果:2012年8月18日星期日
小练习
问:获取任意年份2月份的天数
// 方法1 : 判断平闰年 private static final int YEAR = 1840; @Test public void test04() { GregorianCalendar cal = new GregorianCalendar(); int num = cal.isLeapYear(YEAR) ? 29 : 28; System.out.println(num); } // 方法2 :3月1日往前一天就是2月最后一天 @Test public void test05() { Calendar cal = Calendar.getInstance(); cal.set(YEAR, 2, 1); cal.add(Calendar.DAY_OF_MONTH, -1); System.out.println(cal.get(Calendar.DAY_OF_MONTH)); }