`

java日期操作 及 Timer定时器

阅读更多

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("上一次任务执行还未结束");

}

}

上面代码中"//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 指定任务执行结束

分享到:
评论

相关推荐

    timer定时器(java)

    ### Timer定时器(Java) #### 知识点概述 在Java中,`Timer`类是`java.util`包的一部分,用于调度线程执行任务。它主要用于处理那些需要定期执行的任务,比如更新用户界面、发送电子邮件通知等场景。通过`Timer`...

    Java定时器Timer简述.pdf

    Java定时器Timer是Java编程语言中用于计划执行任务的一种工具类。Timer类主要提供了定时任务的安排执行,对于需要在指定时间后、或者以固定周期重复执行任务的场景非常有用。本文档中介绍的Timer类的实现以及如何...

    java5定时器java Timer

    Java5中的`java.util.Timer`类是一个非常实用的工具,用于调度周期性的任务执行。它在多线程环境中提供了一种高效且灵活的方式来安排任务在未来某个时间点或定期执行。这个类是Java早期版本中对定时任务管理的一个...

    java定时器Timer

    Java定时器(Timer)是Java.util包中的一个类,它提供了调度任务的能力,可以在特定的延迟后或定期执行。在Java编程中,我们有时需要在指定时间执行某些操作,例如发送提醒、执行清理任务等,这时候Java Timer就派上...

    java日期操作大全

    以下是对给定内容中涉及的Java日期操作进行的详细说明: 1. **获取指定月份的第一天**: 使用`java.util.Calendar`类可以方便地获取指定日期所在月份的第一天。首先,将输入的日期字符串转换为`java.util.Date`...

    java的Time、Scheduler定时器

    本文将详细介绍两种常见的Java定时器:`java.util.Timer` 和 `Quartz Scheduler`。 ### 一、Time定时器 `java.util.Timer` 是Java标准库中的一个工具类,用于创建和管理定时任务。它提供了一种简单的方式来安排...

    Java多线程定时器Timer原理及实现

    Java多线程定时器Timer原理及实现 Java多线程定时器Timer原理及实现是Java应用中非常重要的一部分,涉及Timer的schedule的使用,定时器Timer的schedule等相关内容,以及代码示例。 Timer对象在内部使用多线程方式...

    JAVA定时器时间抓取

    本文将深入探讨Java定时器(Timer)的使用以及如何获取和处理年月日、时间节点等时间相关的信息。 1. **Java定时器(Timer)** Java定时器类`java.util.Timer`提供了调度任务的功能,它可以按照预定的时间间隔执行...

    一个定时器Timer实现的钟表.doc

    3. **`Calendar`类**: `Calendar`是Java日期和时间的抽象类,提供了丰富的API来获取和设置日期、时间等信息。在这里,`Calendar`对象`cal`用于获取当前的小时、分钟和秒。 4. **`GregorianCalendar`**: `...

    android定时器Timer实例

    这就是定时器(Timer)的作用。本篇文章将详细探讨Android中的Timer类以及如何使用它来实现定时任务。 `Timer`类是Java.util包下的一个工具类,它提供了调度任务在未来某个时间点执行的功能。虽然在Android中,我们...

    java定时器结合spring

    首先,Java定时器主要由`java.util.Timer`类和`java.util.TimerTask`类组成。`Timer`类是定时器,用于调度任务的执行,而`TimerTask`是可被调度的任务,继承自`Runnable`接口。然而,这种方式并不适合复杂的多线程...

    Java里timer执行定时任务

    当定时器触发时,将调用 `run()` 方法执行具体的操作。 ```java package test; import java.util.Timer; import java.util.TimerTask; public class TimeTaskTest { public static void main(String[] args) { ...

    Java定时器数字时钟

    总的来说,"Java定时器数字时钟"是一个结合了Java基础、多线程(定时器)、日期时间处理和GUI编程的综合项目。它展示了如何在Java中利用定时器实现动态更新,以及如何与系统时间同步,对于学习Java编程和理解其核心...

    java定时器.rar

    Java定时器(Timer)是Java语言中用于调度任务的一个重要工具,它可以帮助我们在特定时间执行一次或重复执行某个任务。这个“java定时器.rar”压缩包可能包含了关于如何使用Java定时器的相关示例代码和教程。 Java...

    Java 定时器程序

    在Java中,我们可以使用`java.util.Timer`类和`java.util.TimerTask`类来实现定时器功能。下面将详细介绍这两个类以及如何使用它们创建一个类似闹钟的定时器程序。 `java.util.Timer`是Java提供的一个线程安全的类...

    JAVA定时器

    在Java中,日期和时间的处理主要依赖于`java.util.Date`、`java.text.SimpleDateFormat`和`java.time`包(Java 8及以上版本)中的类。`DateUtil`可能封装了格式化日期、计算日期差、获取当前时间等常见操作,方便在...

    java 写的定时器

    在Java中,有两种主要的定时器类:`java.util.Timer` 和 `java.util.concurrent.ScheduledExecutorService`。本文将详细讲解这两种定时器的用法、优缺点以及如何在实际项目中应用它们。 ### 1. `java.util.Timer` ...

    JAVA WEB程序中添加定时器

    在JAVA WEB程序中添加定时器可以使用Java的Timer和TimerTask类来实现。 Timer类是Java提供的定时器类,它可以根据指定的时间间隔执行某个任务。TimerTask类则是Timer类的任务执行单元,它可以封装需要执行的任务。...

    java定时器

    在Java中,`java.util.Timer` 是一个轻量级的定时器类,用于调度任务。使用`Timer` 需要注意以下几点: - 创建一个`Timer` 对象。 - 创建一个继承自`TimerTask` 的子类,并重写其中的`run()` 方法来定义具体要执行...

Global site tag (gtag.js) - Google Analytics