我知道在Java中,可以使用ScheduledExecutorService
在一定延迟后执行特定任务。这篇文章展示了如何在特定日期执行任务,但不是使用SimpleDataFormat
。例如,我有一个如下初始化的格式:
dateFormatter = new SimpleDateFormat("MM-dd-yyyy hh:mm aa");
此外,我想执行在ActionListener
中的else if
语句下声明的特定任务,例如:
foo.addActionListener(e -> {
if (condition) {
// some task
} else if (some other condition) { // what I want to be executed at particular date
// some other task
} else {
// another task
}
});
如何初始化在特定日期在SimpleDateFormat
内和/或使用其他
语句执行的SchduledExecutorService
,最好使用SimpleDateFormat
?
一定要使用java。time,用于日期和时间工作的现代Java日期和时间API。取代旧的SimpleDateFormat
的现代类是DateTimeFormatter
。
static DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm a", Locale.ENGLISH);
编辑:正如Basil Bourque在评论中所说,还可以在某个地方声明你的遗嘱执行人服务,当你不再需要时可以关闭它。例如:
static ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
现在在您的操作监听器(或您可能喜欢的任何其他地方)中,您可以执行以下操作:
} else {
String timeString = "04-01-2020 08:00 AM";
ZoneId zone = ZoneId.of("America/Curacao");
ZonedDateTime timeToExecute = LocalDateTime.parse(timeString, formatter)
.atZone(zone);
long delaySeconds = ChronoUnit.SECONDS.between(
ZonedDateTime.now(zone), timeToExecute);
executor.schedule(() -> System.out.println("It’s now " + timeString),
delaySeconds, TimeUnit.SECONDS);
}
请记住关闭执行程序以通过调用释放资源
executor.shutdown();
或者,如果您想取消已经安排的任务,请改用Shutdown Now()
。
我已经为所需的时间和时区设置了非常随机的值,所以请插入您的值。如果需要JVM的时区设置,ZoneId。systemDefault()
是一个选项。
在许多其他优点中java.time更好地支持计算从现在到所需计划时间的时间间隔长度。如果您需要比秒更高的精度,请使用毫秒、微秒甚至纳秒,它的方式非常相似(因为您的字符串似乎只有分钟的精度,我认为没有必要)。
你提到的SimpleDateFormat
是一个臭名昭著的麻烦制造者,你永远不会喜欢使用它。幸运的是,它也早已过时。
Oracle教程:Date Time讲解如何使用java.time.
如何初始化在else if内和/或与else if一起执行的ScheduledExecutorService
你没有。
不要在需要时初始化executor服务。
您可以更早地在其他地方实例化计划执行器服务,并在命名变量中保留一个引用。稍后根据需要调用该executor服务对象。
executor服务可以被调用在应用程序的其他部分运行其他类型的任务。executor服务不需要仅绑定到一种任务。
重要信息:您必须保留对该executor服务的引用,以便它的后台线程池可以在某个时刻正常关闭。否则,线程池可能会在其原始应用程序结束后继续运行。
一般来说,我建议采用这种方法。
搜索堆栈溢出。这个话题已经讨论过很多次了。您将找到示例代码和进一步的讨论。
使用执行器
实用程序类来实例化执行器服务。
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor() ;
将ses
引用存储在应用程序中的某个位置。
计算等待的时间,如Ole V.V.的正确答案所示。
foo.addActionListener(
e -> {
if (condition) {
doSomethingNow() ;
} else if (some other condition) {
long delaySeconds = … ; // See: https://stackoverflow.com/a/60963540/642706
ScheduledExecutorService scheduledExecutorService = Objects.requireNonNull( … ) ; // Locate the existing scheduled executor service.
Runnable task = () -> { System.out.println( "Doing something later. " + Instant.now() ) ; };
scheduledExecutorService.schedule(
task ,
delaySeconds ,
TimeUnit.SECONDS
);
} else {
doSomethingElseNow() ;
}
}
);
当您的应用退出时,请关闭该计划的执行程序服务。
// In the hook for app shut-down.
ScheduledExecutorService scheduledExecutorService = Objects.requireNonNull( … ) ; // Locate the existing scheduled executor service.
scheduledExecutorService.shutdown() ;
问题内容: 如何从日期转换该日期时间? 从此:2016-02-29 12:24:26 至:2016年2月29日 到目前为止,这是我的代码,它返回nil值: 问题答案: 您必须声明2 different ,第一个将字符串转换为a ,第二个以您的格式打印日期。 试试这个代码: Swift 3及更高版本: 从斯威夫特3 类已更改为与对。
设定年月日的排列顺序。
问题内容: 调用a 并获取列的响应将日期值设置为 但。目前,我有一个类似的日期值。我想将此值转换为Edm.DateTIme格式,如上所示。 任何功能都可以实现相同。任何工作。请帮忙。 问题答案: 下列: 打印出: 请注意时区的转换。Java 希望在偏移量中使用冒号。 说到时区,我不知道OData Atom XML是否在某处指定了时区。Edm.DataTime没有此类功能。 编辑 :如果要将输出转换
问题内容: 我正在使用角度以这种格式显示日期 如何显示像 使用角 有没有使用Angular JS-的直接方法(我可以使用普通的jQuery) 问题答案: 使用日期的角度过滤器。 请参阅以下链接。 http://docs.angularjs.org/api/ng.filter:date
我创建了一个JPanel,上面有我需要的所有JRadioButtons(称为PortSettings)。我还有一个按钮,叫做端口设置,当用户单击该按钮时,我需要JPanel上来显示单选按钮。我尝试将JPanel添加到actionlistener中,但没有效果。我的代码在下面。除了portsettings按钮之外,我已经从其他按钮中删除了所有其他ActionListener。如果这个问题让人困惑,我
嗨,我正试图将数据从一个文件加载到Oracle中的一个表中,但我遇到了一个错误ORA-01843:在插入日期时不是一个有效的月份。 干杯