<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,這個(gè)大家都認(rèn)識(shí)了,用于保存日期信息,但不推薦進(jìn)行日期操作及初始化特定日期

           Calendar及其子類(lèi)GregorianCalendar:日歷類(lèi),日期操作,初始化特定日期。

        DateFormat及其子類(lèi)SimpleDateformat: 日期格式化,日期的默認(rèn)顯示方式不適合中國(guó)人,所以需要格式化為中國(guó)人常用的格式來(lái)顯示。

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

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

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

               Date date = cal.getTime();

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

            GregorianCalendar構(gòu)造方法參數(shù)依次為:年,月-1,日,小時(shí),分,秒      

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

                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);

                 注意:月份,實(shí)際的月份要比Clendar得到的加1,因?yàn)閖ava月份是從0~11

    2.日期基本操作

         得到兩個(gè)日期相差的天數(shù)

          Date endDate=..

          Date startDate = ...

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

       得到某個(gè)月的天數(shù)

          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();

          前面我們說(shuō)的都是java.util.Date類(lèi),java.sql.Date類(lèi)是操作數(shù)據(jù)庫(kù)用的日期類(lèi)型

         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,定時(shí)器

         a,編寫(xiě)類(lèi),實(shí)現(xiàn)TimeTask接口,定時(shí)執(zhí)行的代碼寫(xiě)入run()方法中

         b.    timer.schedule(TimeTask子類(lèi)對(duì)象, 開(kāi)始執(zhí)行的日期, 周期);

         周期為毫秒數(shù)

        例子:

        類(lèi)MyTask:

    import java.util.*;

    public class MyTask extends TimerTask {

          public void run() {

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

          }

    }

        類(lèi)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);

          }

    }

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

    在某些時(shí)候, 我們需要實(shí)現(xiàn)這樣的功能,某一程序隔一段時(shí)間執(zhí)行一次,而這一事情由系統(tǒng)本身來(lái)完成,并不是人為的觸發(fā),我們一般可稱(chēng)此為定時(shí)器任務(wù).

      這類(lèi)技術(shù)主要應(yīng)用到那些需要進(jìn)行后臺(tái)整理數(shù)據(jù)的系統(tǒng)中,比如說(shuō)數(shù)據(jù)倉(cāng)儲(chǔ),數(shù)據(jù)挖掘等.

      其實(shí)到Java中,實(shí)現(xiàn)起來(lái)是非常簡(jiǎn)單的,下面我們以每隔5秒鐘打引一句"Hello world"為例:

    import java.util.TimerTask;

    public class TimeTast extends TimerTask ...{

    // 在這里寫(xiě)你要定時(shí)執(zhí)行的方法

    public void run() ...

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

    }

    }

    import java.util.Date;

    import java.util.Timer;

    /** *//**

    * 定時(shí)器測(cè)試

    * @author FeGe

    */

    public class Test ...{

    public void execute() ...{

    Timer timer = new Timer();

    TimeTast myTimeTask = new TimeTast();

    Date date = new Date();

    long timestamp = 5000;

    /** *//**

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

    */

    timer.schedule(myTimeTask, date, timestamp);

    }

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

    Test t = new Test();

    t.execute();

    }

    }

      一個(gè)最簡(jiǎn)單的定時(shí)器任務(wù)就算完成了。是不是太簡(jiǎn)單了點(diǎn)呢,其實(shí)就這么簡(jiǎn)單。

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

    下面就Servlet偵聽(tīng)器結(jié)合Java定時(shí)器來(lái)講述整個(gè)實(shí)現(xiàn)過(guò)程。要運(yùn)用Servlet偵聽(tīng)器需要實(shí)現(xiàn) javax.servlet.ServletContextListener接口,同時(shí)實(shí)現(xiàn)它的contextInitialized (ServletContextEvent event)和contextDestroyed(ServletContextEvent event)兩個(gè)接口函數(shù)。考慮定時(shí)器有個(gè)建立和銷(xiāo)毀的過(guò)程,看了前面兩個(gè)接口函數(shù),就不容置疑的把建立的過(guò)程置入 contextInitialized,把銷(xiāo)毀的過(guò)程置入contextDestroyed了。

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

    private java.util.Timer timer = null;

    public void contextInitialized(ServletContextEvent event) {

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

    event.getServletContext().log("定時(shí)器已啟動(dòng)");

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

    event.getServletContext().log("已經(jīng)添加任務(wù)調(diào)度表");

    }

    public void contextDestroyed(ServletContextEvent event) {

    timer.cancel();

    event.getServletContext().log("定時(shí)器銷(xiāo)毀");

    }

    以 上代碼中, timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000)這一行為定時(shí)器調(diào)度語(yǔ)句,其中MyTask是自定義需要被調(diào)度的執(zhí)行任務(wù)(在我的財(cái)政數(shù)據(jù)中心項(xiàng)目中就是報(bào)表計(jì)算引擎入口),從 java.util.TimerTask繼承,下面會(huì)重點(diǎn)講述,第三個(gè)參數(shù)表示每小時(shí)(即60*60*1000毫秒)被觸發(fā)一次,中間參數(shù)0表示無(wú)延遲。 其它代碼相當(dāng)簡(jiǎn)單,不再詳細(xì)說(shuō)明。

    下面介紹MyTask的實(shí)現(xiàn),上面的代碼中看到了在構(gòu)造MyTask時(shí),傳入了 javax.servlet.ServletContext類(lèi)型參數(shù),是為記錄Servlet日志方便而傳入,因此需要重載MyTask的構(gòu)造函數(shù)(其父 類(lèi)java.util.TimerTask原構(gòu)造函數(shù)是沒(méi)有參數(shù)的)。在timer.schedule()的調(diào)度中,設(shè)置了每小時(shí)調(diào)度一次,因此如果想實(shí) 現(xiàn)調(diào)度任務(wù)每24小時(shí)被執(zhí)行一次,還需要判斷一下時(shí)鐘點(diǎn),以常量C_SCHEDULE_HOUR表示(晚上12點(diǎn),也即0點(diǎn))。同時(shí)為防止24小時(shí)執(zhí)行下 來(lái),任務(wù)還未執(zhí)行完(當(dāng)然,一般任務(wù)是沒(méi)有這么長(zhǎng)的),避免第二次又被調(diào)度以引起執(zhí)行沖突,設(shè)置了當(dāng)前是否正在執(zhí)行的狀態(tài)標(biāo)志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("開(kāi)始執(zhí)行指定任務(wù)");

    //TODO 添加自定義的詳細(xì)任務(wù),以下只是示例

    int i = 0;

    while (i++ < 10) {

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

    }

    isRunning = false;

    context.log("指定任務(wù)執(zhí)行結(jié)束");

    }

    } else {

    context.log("上一次任務(wù)執(zhí)行還未結(jié)束");

    }

    }

    上面代碼中"http://TODO……"之下四行是真正被調(diào)度執(zhí)行的演示代碼(在我的財(cái)政數(shù)據(jù)中心項(xiàng)目中就是報(bào)表計(jì)算過(guò)程),您可以換成自己希望執(zhí)行的語(yǔ)句。

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

    <listener>

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

    </listener>  

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

    2003-12-05 0:21:39 開(kāi)始執(zhí)行指定任務(wù)

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

    ……

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

    2003-12-05 0:21:39 指定任務(wù)執(zhí)行結(jié)束

    posted on 2009-01-21 11:44 冰封的愛(ài) 閱讀(382) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): J2EE
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章分類(lèi)

    文章檔案

    相冊(cè)

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 美女的胸又黄又www网站免费| 亚洲最大激情中文字幕| 91在线视频免费看| 黄色成人网站免费无码av| 免费人成在线观看视频播放 | 亚洲另类图片另类电影| 亚洲日本视频在线观看| 亚洲AV日韩AV一区二区三曲 | 亚洲视频免费播放| 亚洲人成在线精品| 无码人妻精品一二三区免费| 亚洲国产成人久久综合一区77| 亚洲av中文无码乱人伦在线r▽| 亚洲中文字幕人成乱码| 黄床大片免费30分钟国产精品| 6080午夜一级毛片免费看| 国产无遮挡又黄又爽免费视频| 亚洲成av人片天堂网| 亚洲国产精品网站在线播放 | 亚洲成人免费网址| 亚洲中文字幕日本无线码| 日本高清不卡aⅴ免费网站| 成熟女人牲交片免费观看视频| 亚洲一区二区三区在线观看网站| 成全视频在线观看免费| 亚洲首页在线观看| 免费黄色网址入口| 亚洲日本人成中文字幕| 免费看国产曰批40分钟| 亚洲乱亚洲乱妇24p| 美丽的姑娘免费观看在线播放| 亚洲人成人伊人成综合网无码| 亚洲国产黄在线观看| 免费h视频在线观看| 亚洲精品偷拍视频免费观看| 亚洲一区二区三区成人网站| 亚洲国产成人a精品不卡在线| 国产在线观看免费视频软件| 国产精品亚洲午夜一区二区三区 | 99久久国产精品免费一区二区| 久久精品亚洲AV久久久无码|