<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    開花流水

    空山無人,水流花開。

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      79 Posts :: 42 Stories :: 160 Comments :: 0 Trackbacks

        最近,手頭有不少項目,其中就有一個類似公文流轉的項目,其中有一個模塊是任務的制定,而在任務的類型中有一個循環任務,就是用戶輸入任務的開始日期、結束日期,還需要輸入一個周期數,比如每周的星期幾、每月的多少號等,這里面就牽扯到JAVA日期時間的計算,從網上收集了一下,整理下來,供大家參考^_^

        Java 語言的Calendar,GregorianCalendar (日歷),Date(日期), 和DateFormat(日期格式)組成了Java標準的一個基本但是非常重要的部分. 日期是商業邏輯計算一個關鍵的部分. 所有的開發者都應該能夠計算未來的日期, 定制日期的顯示格式, 并將文本數據解析成日期對象。學習日期, 日期格式, 日期的解析和日期的計算。

        我們將討論下面的類:

    1、   具體類(和抽象類相對)java.util.Date

    2、   抽象類java.text.DateFormat 和它的一個具體子類,java.text.SimpleDateFormat

    3、   抽象類java.util.Calendar 和它的一個具體子類,java.util.GregorianCalendar 具體類可以被實例化, 但是抽象類卻不能. 你首先必須實現抽象類的一個具體子類.

    1.    java.util.Date及其格式化

        Date 類從Java 開發包(JDK) 1.0 就開始進化, 當時它只包含了幾個取得或者設置一個日期數據的各個部分的方法, 比如說月, 日, 和年. 這些方法現在遭到了批評并且已經被轉移到了Calendar類里去了, 我們將在本文中進一步討論它. 這種改進旨在更好的處理日期數據的國際化格式. 就象在JDK 1.1中一樣, Date 類實際上只是一個包裹類, 它包含的是一個長整型數據, 表示的是從GMT(格林尼治標準時間)1970年, 1 月 1日00:00:00這一刻之前或者是之后經歷的毫秒數.

    1.1. 創建java.util.DateJava

        統計從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 虛擬機(JVM)主機環境的系統時間.

    import java.util.Date;

    public class DateExample1

    {

    public static void main(String] args)

    {

        // Get the system date/time Date date = new Date(); // 打印出具體的年,月,日,小時,分鐘,秒鐘以及時區

        System.out.println(date.getTime());

    }   

    }

        在星期六, 2001年9月29日, 下午大約是6:50的樣子, 上面的例子在系統輸出設備上顯示的結果是 1001803809710. 在這個例子中,值得注意的是我們使用了Date 構造函數創建一個日期對象, 這個構造函數沒有接受任何參數. 而這個構造函數在內部使用了System.currentTimeMillis() 方法來從系統獲取日期.

    //1年前日期

       java.util.Date myDate=new java.util.Date();   

       long myTime=(myDate.getTime()/1000)-60*60*24*365;  

    myDate.setTime(myTime*1000);  

    String mDate=formatter.format(myDate);//明天日期   

    myDate=new java.util.Date();    

    myTime=(myDate.getTime()/1000)+60*60*24;   

    myDate.setTime(myTime*1000);   

    mDate=formatter.format(myDate);

    //兩個時間之間的天數   

    SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");

    java.util.Date date= myFormatter.parse("2003-05-1");    

    java.util.Date mydate= myFormatter.parse("1899-12-30");   

    long   day=(date.getTime()-mydate.getTime())/(24*60*60*1000);

    //加半小時SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

    java.util.Date date1 = format.parse("2002-02-28 23:16:00");

    long Time=(date1.getTime()/1000)+60*30;

    date1.setTime(Time*1000);String mydate1=formatter.format(date1);

    //年月周求日期

    SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM F E");

    java.util.Date date2= formatter2.parse("2003-05 5 星期五");

    SimpleDateFormat formatter3 = new SimpleDateFormat("yyyy-MM-dd");

    String mydate2=formatter3.format(date2);

    //求是星期幾

    mydate= myFormatter.parse("2001-1-1");

    SimpleDateFormat formatter4 = new SimpleDateFormat("E");

    String mydate3=formatter4.format(mydate);

    1.2. Date格式化

        能以一種用戶明白的格式來顯示這個日期呢? 在這里類java.text.SimpleDateFormat 和它的抽象基類 java.text.DateFormat。那么, 現在我們已經知道了如何獲取從1970年1月1日開始經歷的毫秒數了. 我們如何才format 就派得上用場了.

    // 我們能不能用下面的代碼構件出 2001/8/8 8:8    

    import java.io.*;   

    import java.util.*;   

    public class WhatIsDate   

    {        

        public static void main(String[] args)

       {            

           Date date = new Date(2001, 8, 8, 8, 8, 8);            

           System.out.println(date);       

    }    

    }

    Java 的編譯器竟然報如下信息 (Sun JDK1.3, Windows 2000 中文下)

    注意:

    WhatIsDate.java 使用或覆蓋一個不鼓勵使用的API。

    注意:

        使用-deprecation重新編譯,以得到詳細信息。!那么 Date 對象究竟是為了滿足哪個需求呢?看來它不是用來實現基于年/月/日小時:分鐘 的時間表述。我們查看 Java 的文檔,我們看到有 getTime() 方法,它返回的竟然是一個 long 值。文檔進一步又告訴我們這個值代表了當前系統的時間離1970/1/1 0:0 的毫秒差,而且是在 GMT 時區下(也被稱為 EPOC)。如果我們指定的時間是在此之前的,那它將返回一個負數值。這個發現讓我們對 Date 對象有了一個全新的認識-Date 存放的是與 EPOC 的偏差值。換而言之我們也可通過 long 類型來表示時間?

    對了,這個猜想是得到了 Java 的支持:   

    // 第二種獲得當前時間的方法    

    long dateInMilliSeconds = System.currentTimeMillis();// 這時候打印出的只是一串數字而已    

    System.out.println(dateInMilliSeconds);

        對程序執行效率敏感的程序員可以發現這個方法只是生成一個 Java 的原始類型 (primitive type) long, 不需要實例化一個對象。因此如果我們對時間的處理只是在內部進行時,可以用 long 來代替 Date 對象。最典型的應用就是在一段代碼開始和結束時,分別獲得系統當前的時間,然后計算出代碼執行所需的時間(微秒級)。   

    long start = System.currentTimeMillis();    

    // 代碼段    

    System.out.println("需要 "+(System.currentTimeMillis()-start)+" 微秒");

    那么當我們要把這個 long 值已更為友好的表現形式顯示處理的時候,我們可以用它來構造 Date 對象:Date date = new Date(dateInMilliSeconds);System.out.println(date);我們看到了在 Java 中對時間最為基本的表示,有通過對EPOC 的偏差值進行處理。Date 對象是對它的一個對象的封裝。我們同時也看到了,在現時世界中我們對時間的描述通常是通過"某年某月某日某時某分"來定義的。Date 的顯示(實際上是 toString() 方法)描述了這些信息,但 Java 并不建議我們用這種方式直接來構件 Date 對象。因此我們需要找出哪個對象可以實現這個需求。這就是我們下面就要講述的 Calendar 對象的功能。在我們進一步研究 Calendar 之前,請記住 Date 只是一個對 long 值(基于 GMT 時區)的對象封裝。它所表現出來的年/月/日小時:分鐘時區的時間表述,只是它的 toString() 方法所提供的。千萬不要為這個假象所迷惑。假如我們希望定制日期數據的格式, 比方星期六-9月-29日-2001年. 下面的例子展示了如何完成這個工作:

    import java.text.SimpleDateFormat;

    import java.util.Date;

    public class DateExample2

    {

    public static void main(String[] args)

    {

    SimpleDateFormat bartDateFormat = new SimpleDateFormat("EEEE-MMMM-dd-yyyy");

    Date date = new Date();

    System.out.println(bartDateFormat.format(date));

    }

    }

        只要通過向SimpleDateFormat 的構造函數傳遞格式字符串"EEE-MMMM-dd-yyyy", 我們就能夠指明自己想要的格式. 你應該可以看見, 格式字符串中的ASCII 字符告訴格式化函數下面顯示日期數據的哪一個部分. EEEE是星期, MMMM是月, dd是日, yyyy是年. 字符的個數決定了日期是如何格式化的.傳遞"EE-MM-dd-yy"會顯示 Sat-09-29-01. 請察看Sun 公司的Web 站點獲取日期格式化選項的完整的指示. 1.3. 文本數據解析成日期對象 假設我們有一個文本字符串包含了一個格式化了的日期對象, 而我們希望解析這個字符串并從文本日期數據創建一個日期對象. 我們將再次以格式化字符串"MM-dd-yyyy" 調用SimpleDateFormat類, 但是這一次, 我們使用格式化解析而不是生成一個文本日期數據. 我們的例子, 顯示在下面, 將解析文本字符串"9-29-2001"并創建一個值為001736000000 的日期對象. 通過parse()方法,DateFormat能夠以一個字符串創立一個Date對象。這個方法能拋出ParseException異常,所以你必須使用適當的異常處理技術。例子程序:

    import java.text.SimpleDateFormat; import java.util.Date; public class DateExample3

    {

    public static void main(String[] args)

    {

    // Create a date formatter that can parse dates of

    // the form MM-dd-yyyy. SimpleDateFormat bartDateFormat = new SimpleDateFormat("MM-dd-yyyy");

    // Create a string containing a text date to be parsed. String dateStringToParse = "9-29-2001";

    try

    {

    // Parse the text version of the date.

    // We have to perform the parse method in a

    // try-catch construct in case dateStringToParse

    // does not contain a date in the format we are expecting. Date date = bartDateFormat.parse(dateStringToParse);

    // Now send the parsed date as a long value

    // to the system output. System.out.println(date.getTime()); }catch (Exception ex)

    {

    System.out.println(ex.getMessage());

    }

    }

    }

    1.4. 使用標準的日期格式化過程

        既然我們已經可以生成和解析定制的日期格式了, 讓我們來看一看如何使用內建的格式化過程. 方法 DateFormat.getDateTimeInstance() 讓我們得以用幾種不同的方法獲得標準的日期格式化過程. 在下面的例子中, 我們獲取了四個內建的日期格式化過程. 它們包括一個短的, 中等的, 長的, 和完整的日期格式.

    import java.text.DateFormat;

    import java.util.Date;

    public class DateExample4

    {

    public static void main(String[] args)

    { Date date = new Date();

    DateFormat shortDateFormat = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT);

    DateFormat mediumDateFormat = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.MEDIUM);

    DateFormat longDateFormat = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.LONG);

    DateFormat fullDateFormat = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL);

    System.out.println(shortDateFormat.format(date)); System.out.println(mediumDateFormat.format(date));

    System.out.println(longDateFormat.format(date)); System.out.println(fullDateFormat.format(date));

    }

    }

        注意我們在對 getDateTimeInstance的每次調用中都傳遞了兩個值. 第一個參數是日期風格, 而第二個參數是時間風格. 它們都是基本數據類型int(整型). 考慮到可讀性, 我們使用了DateFormat 類提供的常量: SHORT, MEDIUM, LONG, 和 FULL. 要知道獲取時間和日期格式化過程的更多的方法和選項, 請看Sun 公司Web 站點上的解釋. 運行我們的例子程序的時候, 它將向標準輸出設備輸出下面的內容: 9/29/01 8:44 PM Sep 29, 2001 8:44:45 PM September 29, 2001 8:44:45 PM EDT Saturday, September 29, 2001 8:44:45 PM EDT 2.    Calendar 日歷類 首先請記住 Calendar 只是一個抽象類, 也就是說你無法直接獲得它的一個實例,換而言之你可以提供一個自己開發的 Calendar 對象。那究竟什么是一個 Calendar 呢?中文的翻譯就是日歷,那我們立刻可以想到我們生活中有陽(公)歷、陰(農)歷之分。它們的區別在哪呢?比如有:月份的定義 - 陽`(公)歷 一年12 個月,每個月的天數各不同;陰(農)歷,每個月固定28天,每周的第一天 - 陽(公)歷星期日是第一天;陰(農)歷,星期一是第一天實際上,在歷史上有著許多種紀元的方法。它們的差異實在太大了,比如說一個人的生日是"八月八日" 那么一種可能是陽(公)歷的八月八日,但也可以是陰(農)歷的日期。所以為了計時的統一,必需指定一個日歷的選擇。那現在最為普及和通用的日歷就是 "Gregorian Calendar"。也就是我們在講述年份時常用 "公元幾幾年"。Calendar 抽象類定義了足夠的方法,讓我們能夠表述日歷的規則。Java 本身提供了對 "Gregorian Calendar" 規則的實現。我們從 Calendar.getInstance() 中所獲得的實例就是一個 "GreogrianCalendar" 對象(與您通過 new GregorianCalendar() 獲得的結果一致)。下面的代碼可以證明這一點:   

    import java.io.*;  

    import java.util.*;   

    public class WhatIsCalendar    

    {

             public static void main(String[] args)

          {            

                  Calendar calendar = Calendar.getInstance();  

                if (calendar instanceof GregorianCalendar)                

                      System.out.println("It is an instance of GregorianCalendar");     

        }   

    }

        Calendar 在 Java 中是一個抽象類(Abstract Class),GregorianCalendar 是它的一個具體實現。Calendar 與 Date 的轉換非常簡單:    Calendar calendar = Calendar.getInstance();     // 從一個 Calendar 對象中獲取 Date 對象     Date date = calendar.getTime();     // 將 Date 對象反應到一個 Calendar 對象中,     // Calendar/GregorianCalendar 沒有構造函數可以接受 Date 對象     // 所以我們必需先獲得一個實例,然后設置 Date 對象     calendar.setTime(date);Calendar 對象在使用時,有一些值得注意的事項:

    1. Calendar 的 set() 方法

    set(int field, int value) - 是用來設置"年/月/日/小時/分鐘/秒/微秒"等值field 的定義在 Calendar 中set(int year, int month, int day, int hour, int minute, int second) 但沒有set(int year, int month, int day, int hour, int minute, int second, int millisecond) 前面 set(int,int,int,int,int,int) 方法不會自動將 MilliSecond 清為 0。另外,月份的起始值為0而不是1,所以要設置八月時,我們用7而不是8。calendar.set(Calendar.MONTH, 7);我們通常需要在程序邏輯中將它清為 0,否則可能會出現下面的情況:  

    import java.io.*;   

    import java.util.*;   

    public class WhatIsCalendarWrite    

    {        

    public static void main(String[] args) throws Exception{           

    ObjectOutputStream out =        new ObjectOutputStream(     new FileOutputStream("calendar.out"));           

    Calendar cal1 = Calendar.getInstance();

    posted on 2009-06-27 16:03 開花流水 閱讀(2180) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 黄色三级三级免费看| 无码人妻精品一二三区免费| 日产国产精品亚洲系列| 中文文字幕文字幕亚洲色| 永久免费AV无码国产网站| 亚洲视频手机在线| 99久久99久久精品免费看蜜桃 | 久久久久久精品免费免费自慰| 国产亚洲综合一区柠檬导航| 免费无毒a网站在线观看| 色欲色香天天天综合网站免费| 亚洲AV无码成人精品区蜜桃| 久久久久国产精品免费免费不卡| 亚洲AV区无码字幕中文色| **一级一级毛片免费观看| 亚洲精品第一国产综合野| 成人免费无码大片a毛片软件 | 亚洲国产成人爱av在线播放| 国产成人高清亚洲一区久久 | 亚洲精品无码MV在线观看 | 免费毛片在线看片免费丝瓜视频| 中中文字幕亚洲无线码| 在线免费观看色片| 免费人妻精品一区二区三区| 国产亚洲人成网站在线观看| 日韩免费人妻AV无码专区蜜桃 | h视频在线免费观看| 久久久久久亚洲av成人无码国产| 中国人xxxxx69免费视频| 亚洲av无码兔费综合| 国产亚洲精品成人AA片新蒲金| 亚洲区精品久久一区二区三区| 成人激情免费视频| 一区二区3区免费视频| 亚洲av永久无码精品网站| 亚洲AV无码男人的天堂| 亚洲无码日韩精品第一页| 99re6热视频精品免费观看 | 免费在线观看亚洲| 亚洲国产成人久久综合一| 免费鲁丝片一级观看|