【问题标题】:How to modify java Date to a specific time? [duplicate]如何将java日期修改为特定时间? [复制]
【发布时间】:2021-12-11 03:10:11
【问题描述】:

我正在 Jenkins 中运行一个脚本。一段脚本需要在东部时间 07:00:00 运行。

作业已安排在特定日期和时间。作业从早上 6 点开始,但需要等到早上 7 点才能运行下一步

使用 java,我可以使用以下方法获取当前时间/日期:

Date currentDate = new Date()

我想我需要将 currentDate 与今天早上 7 点的日期进行比较,这样我就可以知道距离早上 7 点还有多少秒,并让我的构建在那段时间进入休眠状态。

我的问题是,如何生成今天早上 7 点的日期?

【问题讨论】:

  • "我的问题是,我怎样才能生成今天早上 7 点的日期?" - new Date().copyWith(hourOfDay: 7, minute: 0, second: 0) 给你你想要的吗?
  • 我建议你不要使用Date。该课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time APIZonedDateTime
  • 早上 7 点在哪个时区?
  • "早上 7 点在哪个时区?" - 问题表明“一段脚本需要在东部时间 07:00:00 运行。”

标签: java shell jenkins groovy


【解决方案1】:

避免使用糟糕的Date 类。旧的日期时间类在几年前被 JSR 310 中定义的现代 java.time 类所取代。

捕捉您在特定时区看到的当前时刻。

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

定义你的目标。

LocalTime targetTime = LocalTime.of( 7 , 0 ) ;

调整到那个时间。

ZonedDateTime zdtTarget = zdt.with( targetTime ) ;

如果那一刻已经过去,请移到第二天。

if( ! zdt.isBefore( zdtTarget ) ) {
    zdtTarget = zdt.toLocalDate().plusDays( 1 ).atStartOfDay( z ).with( targetTime ) ;
}

确定过去的时间。

Duration d = Duration.between( zdt.toInstant() , zdtTarget.toInstant() ) ;

根据需要查询持续时间对象。例如毫秒:

long millis = d.toMillis() ;
Thread.sleep( millis ) ;

如果您必须为尚未更新到java.time 的代码使用java.until.Date,则可以转换。

java.until.Date date = Date.from( zdtTarget.toInstant() ) ;

【讨论】:

  • 这很好用。谢谢。
【解决方案2】:

很好的问题。首先创建一个 Calendar 对象来设置时间、日期和其他自定义输入,然后使用 .getTime() 成员函数将其转换为 Date 对象更容易。 例如:要获取今天上午 7 点的 Date 对象(2021 年 10 月 25 日),请执行以下操作:

Calendar cal = Calendar.getInstance(); // Calendar constructor
cal.set(Calendar.YEAR, 2021);
cal.set(Calendar.MONTH, 10);
cal.set(Calendar.DAY_OF_MONTH, 25);
cal.set(Calendar.HOUR_OF_DAY,7);
cal.set(Calendar.MINUTE,00);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);

Date d = cal.getTime(); // convert to Date obj

有关日历 obj 的更多信息,请查看 Oracle (https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html) 的一些文档

【讨论】:

  • 谢谢,我唯一改变的就是不再设置自己的年月日。我正在使用 cal.setTime(new Date())
  • 这段代码忽略了时区的关键问题。
  • "cal.setTime(new Date())" - 这比Calendar.instance好吗?
猜你喜欢
  • 2018-01-06
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
相关资源
最近更新 更多