首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在特定日期和时间触发java中的事件?

如何在特定日期和时间触发java中的事件?
EN

Stack Overflow用户
提问于 2017-04-08 03:36:58
回答 4查看 12.2K关注 0票数 8

我需要发送短信到少数移动nos在特定的日期和时间。我将有一个日期和时间的清单和相应的移动号码列表。如下所示。

代码语言:javascript
复制
Date                Mobile
10th April 9 AM     1234567890
10th April 11 AM    9987123456,9987123457
11th April 3.30 PM  9987123456

诸若此类。

我知道,java有cron调度程序,可以按特定的时间表运行。

http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html

我可以运行一个作业,它可以继续检查时间,然后如果当前时间与上面列表中的时间相匹配,发送短信。

但在这种情况下,我将不得不一直检查。

有没有办法,我可以直接在给定的时间发射那些事件/短信。比如为每个日期时间注册作业,并在那个时候触发这些作业,而不是让一个作业连续运行以检查日期时间?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-04-08 04:17:34

您可以使用ScheduledExecutorService。见教程

代码语言:javascript
复制
 private class SmsSenderTask implement Runnable {
     private String text;
     private List<String> phoneNumbers;

     public void run() {
         for (String number : phoneNUmbers) {
             sendSms(number, text);
         }
     }
}

ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
for (Date d : dates) {
    long millis = d.getTime() - System.currentTimeMillis();
    service.schedule(new SmsSenderTask(text, phoneNumbers), millis, TimeUnit.MILLISECONDS);
}
票数 5
EN

Stack Overflow用户

发布于 2017-04-09 03:08:35

使用java.time

使用Tulupov的答复ScheduledExecutorService是正确的,应该被接受。这里我讨论日期-时间的角度。

如果可能,将日期时间值序列化为使用标准ISO 8601格式的文本.

2017-04-10 T09:00:00 Z 2017-04-10 T11:00:00 Z 2017-04-11 T15:30:00 Z

java.time类在解析和生成日期时间值时默认使用ISO 8601格式。

代码语言:javascript
复制
Instant instant = Instant.parse( "2017-04-10T09:00:00Z" );

此外,您也忽略了时区这一关键问题。上面字符串上的ZZulu和mean的缩写。Instant类以UTC表示时间线上的一个时刻,分辨率为纳秒 (小数的9 (9)位)。

如果必须使用这些不幸格式的字符串,请搜索堆栈溢出,以便DateTimeFormatter类了解有关字符串解析的更多信息。

如果您的约会时间是针对其他地区的挂钟时间的,那么通过ZoneId分配一个时区以获得ZonedDateTime。搜索堆栈溢出,以便了解更多的类名。

您需要获得几毫秒的时间来用ScheduledExecutorService来调度事件。您必须计算当前时刻与所需事件的Instant之间的毫秒数。这样的时间跨度由Duration类表示为总秒数加上以纳秒为单位的分数秒。您可以要求Duration的总时间跨度为毫秒(截断任何微秒/纳秒)。

代码语言:javascript
复制
Instant now = Instant.now() ;
Duration d = Duration.of( now , instant ) ;
long millis = d.toMillis();

关于java.time

java.time框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.DateCalendarSimpleDateFormat

尤达-时间项目现在在维护模式中,建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310

在哪里获得java.time类?

  • Java 8东南9以及后来的
    • 内置的。
    • 带有捆绑实现的标准Java的一部分。
    • Java 9添加了一些次要的特性和修复。

  • Java 6SE 7
    • java.time的大部分功能都是在http://www.threeten.org/threetenbp/中移植到Java6&7中的。

三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter更多

票数 1
EN

Stack Overflow用户

发布于 2017-04-08 03:42:46

使用Java Timer类在特定时间调度事件。

http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html#schedule(java.util.TimerTask

代码语言:javascript
复制
timer.schedule(new DateTimeTask(), date);

这种方法的缺点是它创建了多个TimerTask的列表。因此,性能取决于要调度的任务的数量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43289895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档