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

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

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

    posts - 14,  comments - 37,  trackbacks - 0

    Date,這個大家都認識了,用于保存日期信息,但不推薦進行日期操作及初始化特定日期

           Calendar及其子類GregorianCalendar:日歷類,日期操作,初始化特定日期。

        DateFormat及其子類SimpleDateformat: 日期格式化,日期的默認顯示方式不適合中國人,所以需要格式化為中國人常用的格式來顯示。

        取得當期日期,    Date date=new Date();

        初始化特定日期:假設我們要得到日期為2006-10-27日的對象,需要按如下方式獲得。

               Calendar cal = new    GregorianCalendar(2006, 9, 27,0,0,0);

               Date date = cal.getTime();

           注意:date,getTime()取得的是當期時間的毫秒數,月份比實際的減1

            GregorianCalendar構造方法參數依次為:年,月-1,日,小時,分,秒      

        格式化為我們熟悉的方式顯示:

                DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH;mm:ss");

                String chinesedate = format.format(date);

       日期 年,月,日,分,秒的取得

                Calendar cal = Calendar.getInstance();

              int year = cal.get(Calendar.YEAR);

                int month=cal.get(Calendar.MONTH)+1;

                int day = cal.get(Calendar.DAY_OF_MONTH);

                 int hour = cal.get(Calendar.HOUR_OF_DAY);

                int    minute = cal.get(Calendar.MINUTE);

                 int second = cal.get(Calendar.SECOND);

                 注意:月份,實際的月份要比Clendar得到的加1,因為java月份是從0~11

    2.日期基本操作

         得到兩個日期相差的天數

          Date endDate=..

          Date startDate = ...

         相差天數 int days=(int) ((endDate.getTime()-startDate.getTime())/(1000*24*60*60)+0.5);

       得到某個月的天數

          Calendar cal = Calendar.getInstance();

         int month=cal.getActualMaximum(Calendar.DAY_OF_MONTH);

       日期加1天

          cal.add(Calendar.DATE, 1);//日期加1天

          Calendar.YEAR,Calendar.MONTH,Calendar.WEEK_OF_YEAR),分別是年,月,周

    3,java.sql,Date()和java.util.Date();

          前面我們說的都是java.util.Date類,java.sql.Date類是操作數據庫用的日期類型

         java.util.Date date=....

          java.sql.Date sqldate=new java.sql.Date(date.getTime());

         也可以這樣:String date="2005-11-10";

          java.sql.Date sqlDate=java.sql.Date.valueOf(date);

    4,定時器

         a,編寫類,實現TimeTask接口,定時執行的代碼寫入run()方法中

         b.    timer.schedule(TimeTask子類對象, 開始執行的日期, 周期);

         周期為毫秒數

        例子:

        類MyTask:

    import java.util.*;

    public class MyTask extends TimerTask {

          public void run() {

              System.out.println("MyTask 正在執行...");

          }

    }

        類TimerDemo:

    import java.util.Timer;

    import java.util.Calendar;

    import java.util.GregorianCalendar;

    import java.util.Date;

    public class TimerDemo {

          public static void main(String[] args) {

              Timer timer = new Timer();

              MyTask task = new MyTask();

              Calendar cal = new GregorianCalendar(2006, 9, 28, 12, 49, 0);

              Date date = cal.getTime();

              System.out.println("date :" + date.toLocaleString());

              timer.schedule(task, date, 1000);

          }

    }

    ***********************************************************************************************

    在某些時候, 我們需要實現這樣的功能,某一程序隔一段時間執行一次,而這一事情由系統本身來完成,并不是人為的觸發,我們一般可稱此為定時器任務.

      這類技術主要應用到那些需要進行后臺整理數據的系統中,比如說數據倉儲,數據挖掘等.

      其實到Java中,實現起來是非常簡單的,下面我們以每隔5秒鐘打引一句"Hello world"為例:

    import java.util.TimerTask;

    public class TimeTast extends TimerTask ...{

    // 在這里寫你要定時執行的方法

    public void run() ...

    System.out.println("Hello World!");

    }

    }

    import java.util.Date;

    import java.util.Timer;

    /** *//**

    * 定時器測試

    * @author FeGe

    */

    public class Test ...{

    public void execute() ...{

    Timer timer = new Timer();

    TimeTast myTimeTask = new TimeTast();

    Date date = new Date();

    long timestamp = 5000;

    /** *//**

    * myTimeTask 指定執行的線程 date 指定第一次日期執行的時間 timestamp 指定每格多久再次執行一次

    */

    timer.schedule(myTimeTask, date, timestamp);

    }

    public static void main(String[] args) ...{

    Test t = new Test();

    t.execute();

    }

    }

      一個最簡單的定時器任務就算完成了。是不是太簡單了點呢,其實就這么簡單。

    **************************************************************************************************************

    下面就Servlet偵聽器結合Java定時器來講述整個實現過程。要運用Servlet偵聽器需要實現 javax.servlet.ServletContextListener接口,同時實現它的contextInitialized (ServletContextEvent event)和contextDestroyed(ServletContextEvent event)兩個接口函數??紤]定時器有個建立和銷毀的過程,看了前面兩個接口函數,就不容置疑的把建立的過程置入 contextInitialized,把銷毀的過程置入contextDestroyed了。

    我把ServletContextListener的實現類取名為ContextListener,在其內添加一個定時器,示例代碼如下所示(為考慮篇幅,僅提供部分代碼供讀者參考):

    private java.util.Timer timer = null;

    public void contextInitialized(ServletContextEvent event) {

    timer = new java.util.Timer(true);

    event.getServletContext().log("定時器已啟動");

    timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000);

    event.getServletContext().log("已經添加任務調度表");

    }

    public void contextDestroyed(ServletContextEvent event) {

    timer.cancel();

    event.getServletContext().log("定時器銷毀");

    }

    以 上代碼中, timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000)這一行為定時器調度語句,其中MyTask是自定義需要被調度的執行任務(在我的財政數據中心項目中就是報表計算引擎入口),從 java.util.TimerTask繼承,下面會重點講述,第三個參數表示每小時(即60*60*1000毫秒)被觸發一次,中間參數0表示無延遲。 其它代碼相當簡單,不再詳細說明。

    下面介紹MyTask的實現,上面的代碼中看到了在構造MyTask時,傳入了 javax.servlet.ServletContext類型參數,是為記錄Servlet日志方便而傳入,因此需要重載MyTask的構造函數(其父 類java.util.TimerTask原構造函數是沒有參數的)。在timer.schedule()的調度中,設置了每小時調度一次,因此如果想實 現調度任務每24小時被執行一次,還需要判斷一下時鐘點,以常量C_SCHEDULE_HOUR表示(晚上12點,也即0點)。同時為防止24小時執行下 來,任務還未執行完(當然,一般任務是沒有這么長的),避免第二次又被調度以引起執行沖突,設置了當前是否正在執行的狀態標志isRunning。示例代 碼如下所示:

    private static final int C_SCHEDULE_HOUR = 0;

    private static boolean isRunning = false;

    private ServletContext context = null;

    public MyTask(ServletContext context) {

    this.context = context;

    }

    public void run() {

    Calendar cal = Calendar.getInstance();

    if (!isRunning) {

    if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {

    isRunning = true;

    context.log("開始執行指定任務");

    //TODO 添加自定義的詳細任務,以下只是示例

    int i = 0;

    while (i++ < 10) {

    context.log("已完成任務的" + i + "/" + 10);

    }

    isRunning = false;

    context.log("指定任務執行結束");

    }

    } else {

    context.log("上一次任務執行還未結束");

    }

    }

    上面代碼中"http://TODO……"之下四行是真正被調度執行的演示代碼(在我的財政數據中心項目中就是報表計算過程),您可以換成自己希望執行的語句。

    到這兒,ServletContextListener和MyTask的代碼都已完整了。最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中加入如下三行:

    <listener>

    <listener-class>com.test.ContextListener</listener-class>

    </listener>  

    當然,上面的com.test得換成您自己的包名了。保存web.xml文件后,把工程打包部署到Tomcat中即可。任務會在每晚12點至凌晨1點之間被執行,上面的代碼會在Tomcat的日志文件中記錄如下:

    2003-12-05 0:21:39 開始執行指定任務

    2003-12-05 0:21:39 已完成任務的1/10

    ……

    2003-12-05 0:21:39 已完成任務的10/10

    2003-12-05 0:21:39 指定任務執行結束

    posted on 2009-01-21 11:44 冰封的愛 閱讀(377) 評論(0)  編輯  收藏 所屬分類: J2EE
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 男的把j放进女人下面视频免费| 亚洲精品V天堂中文字幕| 五级黄18以上免费看| 国产无遮挡裸体免费视频| 麻豆狠色伊人亚洲综合网站| 无码国产精品一区二区免费 | 人人揉揉香蕉大免费不卡| 亚洲一区爱区精品无码| 99麻豆久久久国产精品免费 | 亚洲色大成网站www永久男同 | 色婷五月综激情亚洲综合| 国产成人A在线观看视频免费| 亚洲一区二区三区深夜天堂| 国产香蕉九九久久精品免费| 亚洲AV无码一区二区三区久久精品 | 亚洲精品中文字幕乱码| 日本亚洲免费无线码| 亚洲AV成人影视在线观看| 情侣视频精品免费的国产| 日韩在线观看免费| 亚洲区小说区激情区图片区| 一级毛片**不卡免费播| 亚洲欧洲国产综合| 免费的涩涩视频在线播放| 成人国产网站v片免费观看 | 亚洲欧洲国产成人综合在线观看| 成在线人视频免费视频| 亚洲∧v久久久无码精品| 成人免费在线观看网站| 日本一区二区三区免费高清在线 | 亚洲色图古典武侠| 在线观着免费观看国产黄| igao激情在线视频免费| 久久青青草原亚洲av无码app| 黄色片在线免费观看 | 亚洲av成本人无码网站| 久久国产亚洲精品麻豆| 成人男女网18免费视频| 国产精品九九久久免费视频 | 亚洲精品成人a在线观看| 久久国产乱子伦精品免费看|