gpt4 book ai didi

java - 每天在特定时间运行的计划,带有 hh :mm:ss

转载 作者:行者123 更新时间:2023-12-02 01:55:45 24 4
gpt4 key购买 nike

我尝试在每天的特定时间运行代码,但使用 hh:mm:ss。具体来说,我尝试在美国东部标准时间每天下午 5 点运行它,因此需要考虑时区。

这是我在 kotlin 中的尝试:

val timer = Timer()
val format = SimpleDateFormat("hh:mm:ss")
val date = format.parse("11:07:09")
timer.schedule(object : TimerTask() {
override fun run() {
// code here
}
}, date)

我无法让它工作,即使我做到了,我也不知道如何为其添加时区。

我该怎么做?

最佳答案

tl;博士

java.util.Date
.from(
ZonedDateTime.of(
LocalDate.now( ZoneId.of( "America/Montreal" ) ) ,
LocalTime.parse( "11:07:09" ) ,
ZoneId.of( "America/Montreal" )
)
.toInstant()
)

详细信息

java.util.Date 表示具有 UTC 时间的日期。

您忽略了日期和区域/偏移量。

您的结果显然默认为 1970 年 1 月 1 日上午 11 点。

java.time

此外,糟糕的 DateSimpleDateFormat 类在几年前就被 java.time 类取代了。

代表您一天中的目标时间。

LocalTime lt = LocalTime.parse( "11:07:09" ) ;

获取当前日期,今天的日期。需要时区。对于任何特定时刻,全局各地的日期都会因地区而异。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;

将这些放在一起确定一个时刻。

ZonedDateTime zdt = ZonedDateTime.of( today , lt , z ) ;  // Time-of-day will be adjusted if not valid on that date in that zone. 

调整为 UTC。同一时刻,时间轴上的同一点,不同的挂钟时间。

Instant instant = zdt.toInstant() ;  // Adjust from zone to UTC.

避免遗留日期时间类。但如果必须互操作,则可以通过调用添加到旧类中的新方法来来回转换。

java.util.Date d = java.util.Date.from( instant ) ;

您可能希望改进此代码以查看您想要的时刻是否已经过去。要进行比较,请使用 isAfterisBefore 方法。

执行者

Timer 类已被执行器框架取代。搜索 Oracle Java 教程和 Stack Overflow 以了解更多信息。

使用执行器,您可以安排任务在特定时刻运行。但您可以通过指定等待时间而不是一天中的某个时间来间接完成此操作。调度执行器接受初始延迟的参数。您可以将该延迟计算为当前时刻与所需时刻之间的时间跨度。

要计算该时间跨度,请使用 Duration 类。

Duration d = Duration.between( Instant.now() , instant ) ;

请记住,您不能指望任务在瞬间完美执行。主机操作系统上的 JVM 以及 JVM 内的 Java 线程的调度可能会涉及延迟。

当然,您还需要在完成后记录任务的历史记录。当您的应用程序关闭然后重新启动时,它需要研究历史记录以找出如何设置新的时间表。这个问题超出了本答案的范围。阅读有关编写文件、使用数据库或依赖其他内容的内容 persistence方案。

<小时/>

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在位于 maintenance mode ,建议迁移到java.time类。

要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .

您可以直接与数据库交换java.time对象。使用JDBC driver符合JDBC 4.2或稍后。不需要字符串,不需要 java.sql.* 类。

从哪里获取java.time类?

ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和more .

关于java - 每天在特定时间运行的计划,带有 hh :mm:ss,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52317863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com