如何使用Java中的Date和Calendar类
<p>?Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日期, 定制日期的显示格式, 并将文本数据解析成日期对象. 我们写了两篇文章, 这是第一篇, 我们将大概的学习日期, 日期格式, 日期的解析和日期的计算. </p>
<p> 我们将讨论下面的类:</p>
<p> 具体类(和抽象类相对)java.util.Date</p>
<p> 抽象类java.text.DateFormat 和它的一个具体子类,java.text.SimpleDateFormat</p>
<p> 抽象类java.util.Calendar 和它的一个具体子类,java.util.GregorianCale<br>ndar</p>
<p> 具体类可以被实例化, 但是抽象类却不能. 你首先必须实现抽象类的一个具体子类.</p>
<p> Date 类从Java 开发包(JDK) 1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中进一步讨论它. 这种改进旨在更好的处理日期数据的国际化格式. 就象在JDK 1.1中一样, Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.</p>
<p> 创建一个日期对象</p>
<p> 让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子. 这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间</p>
<p>?</p>
<p>
</p>
<table style="border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="">
<span style="color: #990000; font-weight: bold;">以下是引用片段:</span><br> import?java.util.Date; <br> public?class?DateExample1?{ <br> public?static?void?main(String[]?args)?{ <br> //?Get?the?system?date/time <br> Date?date?=?new?Date(); <br> System.out.println(date.getTime()); <br> } <br> }</td>
</tr></tbody></table>
<p>??????? 那么, 现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了. 我们如何才能以一种用户明白的格式来显示这个日期呢? 在这里类java.text.SimpleDateFormat 和它的抽象基类 java.text.DateFormat 就派得上用场了.</p>
<p>日期数据的定制格式 </p>
<p> 假如我们希望定制日期数据的格式, 比方星期六-9月-29日-2001年. 下面的例子展示了如何完成这个工作:</p>
<p>?</p>
<p>
</p>
<table style="border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="">
<span style="color: #990000; font-weight: bold;">以下是引用片段:</span><br> import?java.text.SimpleDateFormat; <br> import?java.util.Date; <br> public?class?DateExample2?{ <br> public?static?void?main(String[]?args)?{ <br> SimpleDateFormat?bartDateFormat?= <br> new?SimpleDateFormat("EEEE-MMMM-dd-yyyy"); <br> Date?date?=?new?Date(); <br> System.out.println(bartDateFormat.format(date)); <br> } <br> }</td>
</tr></tbody></table>
<p>?</p>
<p> 只要通过向SimpleDateFormat 的构造函数传递格式字符串"EEE-MMMM-dd-yyyy", 我们就能够指明自己想要的格式. 你应该可以看见, 格式字符串中的ASCII 字符告诉格式化函数下面显示日期数据的哪一个部分. EEEE是星期, MMMM是月, dd是日, yyyy是年. 字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示 Sat-09-29-01. 请察看Sun 公司的Web 站点获取日期格式化选项的完整的指示.</p>
<p> Calendar 类 </p>
<p> 我们现在已经能够格式化并创建一个日期对象了, 但是我们如何才能设置和获取日期数据的特定部分呢, 比如说小时, 日, 或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类. 就如我们前面提到的那样, Calendar 类中的方法替代了Date 类中被人唾骂的方法.</p>
<p> 假设你想要设置, 获取, 和操纵一个日期对象的各个部分, 比方一个月的一天或者是一个星期的一天. 为了演示这个过程, 我们将使用具体的子类 java.util.GregorianCalendar. 考虑下面的例子, 它计算得到下面的第十个星期五是13号.</p>
<p>
</p>
<table style="border: #cccccc 1px dotted;" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="">
<span style="color: #990000; font-weight: bold;">以下是引用片段:</span><br> import?java.util.GregorianCalendar; <br> import?java.util.Date; <br> import?java.text.DateFormat; <br> public?class?DateExample5?{ <br> public?static?void?main(String[]?args)?{ <br> DateFormat?dateFormat?= <br> DateFormat.getDateInstance(DateFormat.FULL); <br> //?Create?our?Gregorian?Calendar. <br> GregorianCalendar?cal?=?new?GregorianCalendar(); <br> //?Set?the?date?and?time?of?our?calendar <br> //?to?the?system's?date?and?time <br> cal.setTime(new?Date()); <br> System.out.println("System?Date:?"?+ <br> dateFormat.format(cal.getTime())); <br> //?Set?the?day?of?week?to?FRIDAY <br> cal.set(GregorianCalendar.DAY_OF_WEEK, <br> GregorianCalendar.FRIDAY); <br> System.out.println("After?Setting?Day?of?Week?to?Friday:?"?+ <br> dateFormat.format(cal.getTime())); <br> int?friday13Counter?=?0; <br> while?(friday13Counter?<=?10)?{ <br> //?Go?to?the?next?Friday?by?adding?7?days. <br> cal.add(GregorianCalendar.DAY_OF_MONTH,?7); <br> //?If?the?day?of?month?is?13?we?have <br> //?another?Friday?the?13th. <br> if?(cal.get(GregorianCalendar.DAY_OF_MONTH)?==?13)?{ <br> friday13Counter++; <br> System.out.println(dateFormat.format(cal.getTime())); <br> } <br> } <br> } <br> }</td>
</tr></tbody></table>
<p>?</p>
<p> 在这个例子中我们作了有趣的函数调用:</p>
<p> cal.set(GregorianCalendar.DAY_OF_WEEK,</p>
<p> GregorianCalendar.FRIDAY);</p>
<p> 和:</p>
<p> cal.add(GregorianCalendar.DAY_OF_MONTH, 7);</p>
<p> set 方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五. 注意到这里我们使用了常量 DAY_OF_WEEK 和 FRIDAY来增强代码的可读性. add 方法让我们能够在日期上加上数值. 润年的所有复杂的计算都由这个方法自动处理.</p>
<p>时间掌握在你的手里 </p>
<p><span><img style="width: 827px; height: 285px;" src="http://hiphotos.baidu.com/huzhiyong50/pic/item/87ed3ccf7eaa365d92457ead.jpg" alt="怎么使用Java中的Date和Calendar类" width="825" height="218"></span></p>
<p> 有了这些Date 和Calendar 类的例子, 你应该能够使用 java.util.Date, java.text.SimpleDateFormat, 和 java.util.GregorianCalendar 创建许多方法了</p>