科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道如何使用Java中的Date和Calendar类

如何使用Java中的Date和Calendar类

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

如何使用Java中的Date和Calendar类

作者:blackpupil 来源:赛迪网技术社区 2007年10月31日

关键字: Calendar Date java

  • 评论
  • 分享微博
  • 分享邮件
Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日期, 定制日期的显示格式, 并将文本数据解析成日期对象. 我们写了两篇文章, 这是第一篇, 我们将大概的学习日期, 日期格式, 日期的解析和日期的计算. >T0[j&(fI  
 8I5n`A  
  我们将讨论下面的类: M7.Yu  
i~BT}|\]B  
  具体类(和抽象类相对)java.util.Date Qd*[o0 @U  
NZs Kx  
  抽象类java.text.DateFormat 和它的一个具体子类,java.text.SimpleDateFormat ^y+s 61  
1 p%(^X^  
  抽象类java.util.Calendar 和它的一个具体子类,java.util.GregorianCalendar f )&F0<  
n!y*frbB  
  具体类可以被实例化, 但是抽象类却不能. 你首先必须实现抽象类的一个具体子类.  {U  
u8xvEN  
  Date 类从Java 开发包(JDK) 1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中进一步讨论它. 这种改进旨在更好的处理日期数据的国际化格式. 就象在JDK 1.1中一样, Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数. I#FVZB=Qz  
* \"*g  
  创建一个日期对象 F?v.=E^m  
kKlPqC \q  
  让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子. 这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间. is ]Cr6@I  
T&>Qo&%"_  
以下是引用片段: zvMdK70q  
  import java.util.Date; Ax<e_"6  
  public class DateExample1 { TvOH8m'  
  public static void main(String[] args) { f>.2iy[V7  
  // Get the system date/time o^]s5i"^  
  Date date = new Date(); Yr4DcA8  
  System.out.println(date.getTime()); ,% -JeR"  
  } B CtA9' }  
  } g{MW\wn  
lELlM\a@  
l ;7O (^<  
  在星期六, 2001年9月29日, 下午大约是6:50的样子, 上面的例子在系统输出设备上显示的结果是 1001803809710. 在这个例子中,值得注意的是我们使用了Date 构造函数创建一个日期对象, 这个构造函数没有接受任何参数. 而这个构造函数在内部使用了System.currentTimeMillis() 方法来从系统获取日期. 'LpF %m  
{iJC  
  那么, 现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了. 我们如何才能以一种用户明白的格式来显示这个日期呢? 在这里类java.text.SimpleDateFormat 和它的抽象基类 java.text.DateFormat 就派得上用场了. R6wXni*  
S2||5l1  
  日期数据的定制格式 nX%PH:A db  
{ ~@BCeW  
  假如我们希望定制日期数据的格式, 比方星期六-9月-29日-2001年. 下面的例子展示了如何完成这个工作: x)LKnm`V  
JKAp[XO   
以下是引用片段: J~zkP7<Pc  
  import java.text.SimpleDateFormat; MEv"ty4Z  
  import java.util.Date; `c/ kU  
  public class DateExample2 { PXWDxG/t  
  public static void main(String[] args) { ^E"<{+z  
  SimpleDateFormat bartDateFormat = %lf1/N1  
  new SimpleDateFormat("EEEE-MMMM-dd-yyyy"); ]`uu~wV  
  Date date = new Date(); N)Y]cD`1I  
  System.out.println(bartDateFormat.format(date)); (n*-!9 *{  
  } &]Z~/Oa  
  } pkYXl acI  
t \Wgi  
*UkW$2?nhG  
  只要通过向SimpleDateFormat 的构造函数传递格式字符串"EEE-MMMM-dd-yyyy", 我们就能够指明自己想要的格式. 你应该可以看见, 格式字符串中的ASCII 字符告诉格式化函数下面显示日期数据的哪一个部分. EEEE是星期, MMMM是月, dd是日, yyyy是年. 字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示 Sat-09-29-01. 请察看Sun 公司的Web 站点获取日期格式化选项的完整的指示. |o\_c5Sh  
"{VhP8  
将文本数据解析成日期对象 #-kIK!+  
C{B[mv7|  
  假设我们有一个文本字符串包含了一个格式化了的日期对象, 而我们希望解析这个字符串并从文本日期数据创建一个日期对象. 我们将再次以格式化字符串"MM-dd-yyyy" 调用SimpleDateFormat类, 但是这一次, 我们使用格式化解析而不是生成一个文本日期数据. 我们的例子, 显示在下面, 将解析文本字符串"9-29-2001"并创建一个值为001736000000 的日期对象. BI*v{b$*  
~7W~^=JA  
  例子程序: w_>S C'(  
(I\o[F  
以下是引用片段: |^>3,{}  
  import java.text.SimpleDateFormat; oPB_=E  
  import java.util.Date; 0*c0+ []1  
  public class DateExample3 { "I'IDWL ?  
  public static void main(String[] args) { e4bW`;  
  // Create a date formatter that can parse dates of _*CXB!Q  
  // the form MM-dd-yyyy.  Ssd_jz#  
  SimpleDateFormat bartDateFormat = C.we-o8\Y  
  new SimpleDateFormat("MM-dd-yyyy"); uzw*)LYz  
  // Create a string containing a text date to be parsed. |CQ9E >  
  String dateStringToParse = "9-29-2001"; :2k*5ojk  
  try { Y.8$A)  
  // Parse the text version of the date. -ude22R  
  // We have to perform the parse method in a p7uF @i}  
  // try-catch construct in case dateStringToParse D.D<\s`V|  
  // does not contain a date in the format we are expecting. m#g/W*$_DN  
  Date date = bartDateFormat.parse(dateStringToParse); p`xJo5 f3  
  // Now send the parsed date as a long value uMo [x_  
  // to the system output. aNWGJ x  
  System.out.println(date.getTime()); dua~Om3C  
  } 0WKh.~  
  catch (Exception ex) { :}6e60W  
  System.out.println(ex.getMessage()); `+%q!uK  
  } 6w:]K"+xTx  
  } vm$:HaXa  
  } ~A9%uK:   
e4YZ3Gs  
A+$G3K/_  
  使用标准的日期格式化过程 JnyZLjeh  
Q_5Yg&`6  
  既然我们已经可以生成和解析定制的日期格式了, 让我们来看一看如何使用内建的格式化过程. 方法 DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过程. 在下面的例子中, 我们获取了四个内建的日期格式化过程. 它们包括一个短的, 中等的, 长的, 和完整的日期格式. n6pxz'aVX  
$j _6t91  
以下是引用片段: f;|i  
  import java.text.DateFormat; F[ IZ=Jx  
  import java.util.Date; QI%z4NA  
  public class DateExample4 { QjZ)WN0i  
  public static void main(String[] args) { y:V<,QW  
  Date date = new Date(); }-L !N*X^  
  DateFormat shortDateFormat = Xxd|M~R{  
  DateFormat.getDateTimeInstance( 7P=/G4.'XT  
  DateFormat.SHORT, 0 :5/q?YOz  
  DateFormat.SHORT); pMVH=ByFw  
  DateFormat mediumDateFormat = Iv<H%~  
  DateFormat.getDateTimeInstance( m=r8mS95  
  DateFormat.MEDIUM, o^*:9+>  
  DateFormat.MEDIUM); W=N.oPks  
  DateFormat longDateFormat = m\('[|F  
  DateFormat.getDateTimeInstance( :c8TI3v34  
  DateFormat.LONG, tdJ"kX7w-~  
  DateFormat.LONG); ,2G]OW63  
  DateFormat fullDateFormat = a':Z.ludd  
  DateFormat.getDateTimeInstance( iHj-*?3yk  
  DateFormat.FULL, (kC}#zt p  
  DateFormat.FULL); L} }%'  
  System.out.println(shortDateFormat.format(date)); Yc, ;J:~  
  System.out.println(mediumDateFormat.format(date)); <P7@ HF  
  System.out.println(longDateFormat.format(date)); f+FOaR6Pm  
  System.out.println(fullDateFormat.format(date)); =h>KWHnOP  
  } E1\p(]=e  
  } <`S68GS.  
fp^NlZYEO  
0!gBw{;  
  注意我们在对 getDateTimeInstance的每次调用中都传递了两个值. 第一个参数是日期风格, 而第二个参数是时间风格. 它们都是基本数据类型int(整型). 考虑到可读性, 我们使用了DateFormat 类提供的常量: SHORT, MEDIUM, LONG, 和 FULL. 要知道获取时间和日期格式化过程的更多的方法和选项, 请看Sun 公司Web 站点上的解释. No2y?Uu  
VX 6 Yt|  
运行我们的例子程序的时候, 它将向标准输出设备输出下面的内容: ]2T |#H7)$  
Z&qbmn  
  9/29/01 8:44 PM +7.ut^eUlq  
C :; {Xp:  
  Sep 29, 2001 8:44:45 PM d]u{eh[]  
DZd/w=NOh  
  September 29, 2001 8:44:45 PM EDT U*3 ,?  
W'X-+kGI  
  Saturday, September 29, 2001 8:44:45 PM EDT 4jV ::KC  
BI5+b-ubi  
  Calendar 类 j Wna|v+`  
(FUA"3H  
  我们现在已经能够格式化并创建一个日期对象了, 但是我们如何才能设置和获取日期数据的特定部分呢, 比如说小时, 日, 或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类. 就如我们前面提到的那样, Calendar 类中的方法替代了Date 类中被人唾骂的方法. o!}FB_*%  
=VgoZ.=  
  假设你想要设置, 获取, 和操纵一个日期对象的各个部分, 比方一个月的一天或者是一个星期的一天. 为了演示这个过程, 我们将使用具体的子类 java.util.GregorianCalendar. 考虑下面的例子, 它计算得到下面的第十个星期五是13号. UvHwG W$  
<j-asR  
以下是引用片段: Q;<$ |Lo  
  import java.util.GregorianCalendar; @ZB U  
  import java.util.Date; *g6s  
  import java.text.DateFormat; o[~ee]o,  
  public class DateExample5 { :L6m 1C%  
  public static void main(String[] args) { X]]>m,6A  
  DateFormat dateFormat = xH&9VVIF%  
  DateFormat.getDateInstance(DateFormat.FULL); OJ4n'rp  
  // Create our Gregorian Calendar. P|?IP]0>  
  GregorianCalendar cal = new GregorianCalendar(); )PO[=.m7J  
  // Set the date and time of our calendar 1WA shk  
  // to the system's date and time >vi[$O""n]  
  cal.setTime(new Date()); ]x g}'i~\  
  System.out.println("System Date: " +  vTC/  
  dateFormat.format(cal.getTime())); c,z_d"H  
  // Set the day of week to FRIDAY hpb>0#(s  
  cal.set(GregorianCalendar.DAY_OF_WEEK, fOdF`Y~r  
  GregorianCalendar.FRIDAY); _S&;U?Q   
  System.out.println("After Setting Day of Week to Friday: " + BDYMCR<x  
  dateFormat.format(cal.getTime())); .e1^C Pke  
  int friday13Counter = 0; >'(W8  
  while (friday13Counter <= 10) { KK^WtLl2}c  
  // Go to the next Friday by adding 7 days. G:2}92  
  cal.add(GregorianCalendar.DAY_OF_MONTH, 7); z"yd+o1  
  // If the day of month is 13 we have YS+Jg^fx  
  // another Friday the 13th. iaS(09c 8  
  if (cal.get(GregorianCalendar.DAY_OF_MONTH) == 13) { 5%?]VUQb  
  friday13Counter++; /YnOY_?m  
  System.out.println(dateFormat.format(cal.getTime())); 9%vSaOr=  
  } >hM,Re6G  
  } YYy"pf)w  
  } T$"]J$n^Z  
  } d$>[2-E  
o\dyDw  
"VM@hR@  
  在这个例子中我们作了有趣的函数调用: G'%w(;qh5  
^@cp?O&  
  cal.set(GregorianCalendar.DAY_OF_WEEK, wgVyKk1  
f(&G}B@  
  GregorianCalendar.FRIDAY); E=eL Ayy~  
"C"`Kg  
  和: ER6!iZ4  
_m>m6f  
  cal.add(GregorianCalendar.DAY_OF_MONTH, 7); '< x2XDd  
3')S$n</  
  set 方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五. 注意到这里我们使用了常量 DAY_OF_WEEK 和 FRIDAY来增强代码的可读性. add 方法让我们能够在日期上加上数值. 润年的所有复杂的计算都由这个方法自动处理. x.84/  
:3^5 %  
我们这个例子的输出结果是: C?u> f&U  
9awO_2   
  System Date: Saturday, September 29, 2001 V>AfI! ='  
!qzH@<0 j  
  当我们将它设置成星期五以后就成了: Friday, September 28, 2001 G1Nqm{Z  
GOo:|d5VL\  
  Friday, September 13, 2002 l,1\Wr  
-IzkUt_  
  Friday, December 13, 2002 -cxQ}  
>n)]#$*(=  
  Friday, June 13, 2003 #]Fh&>A  
almcf9`N6l  
  Friday, February 13, 2004 w}sN}^8l  
JJM1Z7f  
  Friday, August 13, 2004 F?5/5D'  
dRJ>8'6*  
  Friday, May 13, 2005 OE)!!NO]  
Y5w#-l=K  
  Friday, January 13, 2006 TX\T5I:$  
N&o`ph  
  Friday, October 13, 2006 |GXDU9"?Z  
(t~HUZ&2  
  Friday, April 13, 2007 A">HOMf  
u_F tgQ  
  Friday, July 13, 2007 S)5ViuKC?  
@]-^#[\.  
  Friday, June 13, 2008 r-,\G8D`~  
* Eh|  
  时间掌握在你的手里 PRQZ3j {  
BcyWIy~/{  
  有了这些Date 和Calendar 类的例子, 你应该能够使用 java.util.Date, java.text.SimpleDateFormat, 和 java.util.GregorianCalendar 创建许多方法了. :8$7 K&y  查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章