这篇文章介绍了关于日期处理的3个重要的类:Date,DateFormat,GregorianCalendar.这些类让你创建日期,转换成字符串,和计算日期基本元素。处理Java中的日期问题,这篇文章只是冰山一角。可是,我在这里介绍的类和方法不仅仅是你学习高级技术的跳板,这些类和方法本身就可以处理很多通常的日期相关的任务。
Java核算从1970年1月1日起的毫秒的数量表明日期。也就是说,例如,1970年1月2日,是在1月1日后的86,400,000毫秒。相同的,1969年12月31日是在1970年1月1日前86,400,000毫秒。Java的Date类运用long类型纪录这些毫秒值.由于long是有符号整数,所以日期能够在1970年1月1日之前,也能够在这之后。Long类型表明的***正值和***负值能够轻松的表明290,000,000年的时间,这合适大多数人的时间要求。
Java编程言语中的Date类
Date类能够在java.util包中找到,用一个long类型的值表明一个指定的时间。它的一个有用的结构函数是Date(),它创立一个表明创立时间的方针。getTime()办法回来Date方针的long值。鄙人面的程序中,我运用Date()结构函数创立一个表明程序运转时间的方针,并且运用getTime()办法找到这个日期代表的毫秒数量:
- importjava.util.*;
- publicclassNow{
- publicstaticvoidmain(String[]args){
- Datenow=newDate();
- longnowLong=now.getTime();
- System.out.println("Valueis"+nowLong);
- }
- }
当我运转这个程序后,我得到972,568,255,150.快速承认一下这个数字,最少在一个合理的规模:它不到31年,这个数值相对1970年1月1日到我写这篇文章的时间来说,是合理的。核算机是这个毫秒值表明时间,人们可不乐意说"我将在996,321,998,34见到你。"走运的是,Java供给了一个转化Date方针到字符串的途径,表明成传统的方式。咱们鄙人一节评论DateFormat类,它直观的树立日期字符串。
Java编程言语中的DateFormat类
DateFormat类的一个方针是树立一个人们能够辨认的字符串。可是,由于言语的不同,不是所有的人期望看到严厉的相同格局的日期。法国人更喜爱看到"25decembre2000,",可是美国人习气看到"December25,2000."所以一个DateFormat的实例创立今后,这个方针包含了日期的显现格局的信息。假如运用用户电脑区域设置缺省的格局,你能够象下面那样,创立DateFormat方针,运用getDateInstance()办法:
DateFormatdf=DateFormat.getDateInstance();
DateFormat类在java.text包中能够找到。
转化成字符串
你能够运用format()办法转化Date方针为一个字符串。下面的示例程序说明晰这个问题:
- importjava.util.*;
- importjava.text.*;
- publicclassNowString{
- publicstaticvoidmain(String[]args){
- Datenow=newDate();
- DateFormatDateFormatdf=DateFormat.getDateInstance();
- Strings=df.format(now);
- System.out.println("Todayis"+s);
- }
- }
在上面的代码中,展现了没有参数,运用缺省格局的getDateInstance()办法。Java还供给了几个挑选日期格局,你能够经过运用重载的getDateInstance(intstyle)取得。出于便利的原因,DateFormat供给了几种预置的常量,你能够运用这些常量参数。下面是几个SHORT,MEDIUM,LONG,和FULL类型的示例:
- importjava.util.*;
- importjava.text.*;
- publicclassStyleDemo{
- publicstaticvoidmain(String[]args){
- Datenow=newDate();
- DateFormatDateFormatdf=DateFormat.getDateInstance();
- DateFormatDateFormatdf1=DateFormat.getDateInstance(DateFormat.SHORT);
- DateFormatDateFormatdf2=DateFormat.getDateInstance(DateFormat.MEDIUM);
- DateFormatDateFormatdf3=DateFormat.getDateInstance(DateFormat.LONG);
- DateFormatDateFormatdf4=DateFormat.getDateInstance(DateFormat.FULL);
- Strings=df.format(now);
- Strings1=df1.format(now);
- Strings2=df2.format(now);
- Strings3=df3.format(now);
- Strings4=df4.format(now);
- System.out.println("(Default)Todayis"+s);
- System.out.println("(SHORT)Todayis"+s1);
- System.out.println("(MEDIUM)Todayis"+s2);
- System.out.println("(LONG)Todayis"+s3);
- System.out.println("(FULL)Todayis"+s4);
- }
- }
程序输出如下:
(Default)TodayisNov8,2000
(SHORT)Todayis11/8/00
(MEDIUM)TodayisNov8,2000
(LONG)TodayisNovember8,2000
(FULL)TodayisWednesday,November8,2000
相同的程序,在我的电脑上运用缺省设置运转后,改动区域设置为瑞典,输出如下:
(Default)Todayis2000-nov-08
(SHORT)Todayis2000-11-08
(MEDIUM)Todayis2000-nov-08
(LONG)Todayisden8november2000
(FULL)Todayisden8november2000
从这儿,你能看到,瑞典的月份不是大写的(尽管November仍是november).还有,LONG和FULL版别在瑞典语中是相同的,可是美国英语却不同。别的,风趣的是,瑞典语单词的星期三,onsdag,没有包含在FULL日期里,英语却包含。
留意你能够运用getDateInstance()办法改动DateFormat实例的语种;可是,在上面的比如中,是经过改动Windows98的控制面板的区域设置做到的。不同的当地的区域设置不同,成果就不同,这样有优点,也有缺乏,Java程序员应该了解这些。一个优点是Java程序员能够只写一行代码就能够显现日期,并且国际不同区域的电脑运转相同的程序会有不必的日期格局。可是这也是一个缺陷,当程序员期望显现同一种格局的时--这也有可取之处,举例来说,在程序中混合输出文本和日期,假如文本是英文,咱们就不期望日期格局是其他的格局,象德文或是西班牙文。假如程序员依托日期格局编程,日期格局将依据运转程序地点电脑的区域设置不必而不同。
解析字符串
经过parse()办法,DateFormat能够以一个字符串创立一个Date方针。这个办法能抛出ParseException反常,所以你有必要运用恰当的反常处理技能。下面的比如程序经过字符串创立Date方针:
- importjava.util.*;
- importjava.text.*;
- publicclassParseExample{
- publicstaticvoidmain(String[]args){
- Stringds="November1,2000";
- DateFormatDateFormatdf=DateFormat.getDateInstance();
- try{
- Dated=df.parse(ds);
- }
- catch(ParseExceptione){
- System.out.println("Unabletoparse"+ds);
- }
- }
- }
在创立一个恣意的日期时parse()办法很有用。我将经过另一种办法创立一个恣意得日期。一起,你将看到怎样进行根本日期核算,例如核算90天后的另一天。你能够运用GregorianCalendar类来完结这个使命。
GregorianCalendar类
创立一个代表恣意日期的一个途径运用GregorianCalendar类的结构函数,它包含在java.util包中:
GregorianCalendar(intyear,intmonth,intdate)
留意月份的表明,一月是0,二月是1,以此类推,是12月是11。由于大多数人习气于运用单词而不是运用数字来表明月份,这样程序或许更易读,父类Calendar运用常量来表明月份:JANUARY,FEBRUARY,等等。所以,创立Wilbur和Orville制作***架动力飞机的日期(December17,1903),你能够运用:
GregorianCalendarfirstFlight=newGregorianCalendar(1903,Calendar.DECEMBER,17);
出于清楚的考虑,你应该运用前面的方式。可是,你也应该学习怎样阅览下面的短格局。下面的比如相同表明December17,1903(记住,在短格局中,11表明December)
GregorianCalendarfirstFlight=newGregorianCalendar(1903,11,17);
在上一节中,你学习了转化Date方针到字符串。这儿,你能够做相同的工作;可是首要,你需要将GregorianCalendar方针转化到Date。要做到这一点,你能够运用getTime()办法,从它得父类Calendar承继而来。GetTime()办法回来GregorianCalendar相应的Date方针。你能够创立GregorianCalendar方针,转化到Date方针,得到和输出相应的字符串这样一个进程。下面是比如:
- importjava.util.*;
- importjava.text.*;
- publicclassFlight{
- publicstaticvoidmain(String[]args){
- GregorianCalendarfirstFlight=newGregorianCalendar(1903,Calendar.DECEMBER,17);
- Dated=firstFlight.getTime();
- DateFormatDateFormatdf=DateFormat.getDateInstance();
- Strings=df.format(d);
- System.out.println("Firstflightwas"+s);
- }
- }
有时候创立一个代表当时时间的GregorianCalendar类的实例是很有用的。你能够简略的运用没有参数的GregorianCalendar结构函数,象这样:
GregorianCalendarthisday=newGregorianCalendar();
一个输出今日日期的比如程序,运用GregorianCalendar方针:
- importjava.util.*;
- importjava.text.*;
- classToday{
- publicstaticvoidmain(String[]args){
- GregorianCalendarthisday=newGregorianCalendar();
- Dated=thisday.getTime();
- DateFormatDateFormatdf=DateFormat.getDateInstance();
- Strings=df.format(d);
- System.out.println("Todayis"+s);
- }
- }
留意到,Date()结构函数和GregorianCalendar()结构函数很相似:都创立一个方针,条件简略,代表今日。
日期处理
GregorianCalendar类供给处理日期的办法。一个有用的办法是add().运用add()办法,你能够添加象年,月数,天数到日期方针中。要运用add()办法,你有必要供给要添加的字段,要添加的数量。一些有用的字段是DATE,MONTH,YEAR,和WEEK_OF_YEAR。下面的程序运用add()办法核算未来80天的一个日期。在Jules的是一个重要的数字,运用这个程序能够核算PhileasFogg从动身的那一天1872年10月2日后80天的日期:
- importjava.util.*;
- importjava.text.*;
- publicclassWorld{
- publicstaticvoidmain(String[]args){
- GregorianCalendarworldTour=newGregorianCalendar(1872,Calendar.OCTOBER,2);
- worldTour.add(GregorianCalendar.DATE,80);
- Dated=worldTour.getTime();
- DateFormatDateFormatdf=DateFormat.getDateInstance();
- Strings=df.format(d);
- System.out.println("80daytripwillend"+s);
- }
- }
这个比如是幻想的,但在一个日期上添加天数是一个遍及的操作:影碟能够租3天,图书馆能够借书21天,商铺常常需要将购买的物品在30天内卖出。下面的程序演示了运用年核算:
- importjava.util.*;
- importjava.text.*;
- publicclassMortgage{
- publicstaticvoidmain(String[]args){
- GregorianCalendarmortgage=newGregorianCalendar(1997,Calendar.MAY,18);
- mortgage.add(Calendar.YEAR,15);
- Dated=mortgage.getTime();
- DateFormatDateFormatdf=DateFormat.getDateInstance();
- Strings=df.format(d);
- System.out.println("15yearmortgageamortizedon"+s);}
- }
add()一个重要的副作用是它改动的本来的日期。有时候,具有原始日期和修改后的日期很重要。不幸的是,你不能简略的创立一个GregorianCalendar方针,设置它和本来的持平(equal)。原因是两个变量指向同一个Date()方针地址。假如Date方针改动,两个变量就指向改动后的日期方针。替代这种做法,应该创立一个新方针。下面的程序演示了这种做法:
- importjava.util.*;
- importjava.text.*;
- publicclassThreeDates{
- publicstaticvoidmain(String[]args){
- GregorianCalendargc1=newGregorianCalendar(2000,Calendar.JANUARY,1);
- GregorianCalendargc2=gc1;
- GregorianCalendargc3=newGregorianCalendar(2000,Calendar.JANUARY,1);
- //ThreedatesallequaltoJanuary1,2000
- gc1.add(Calendar.YEAR,1);
- file://gc1andgc2arechanged
- DateFormatDateFormatdf=DateFormat.getDateInstance();
- Dated1=gc1.getTime();
- Dated2=gc2.getTime();
- Dated3=gc3.getTime();
- Strings1=df.format(d1);
- Strings2=df.format(d2);
- Strings3=df.format(d3);
- System.out.println("gc1is"+s1);
- System.out.println("gc2is"+s2);
- System.out.println("gc3is"
知优网 » 浅谈Java编程语言中创建和运用日期(java创建时间类)