如何在 Java 中偏移日期以适应 DST

Posted

技术标签:

【中文标题】如何在 Java 中偏移日期以适应 DST【英文标题】:How to offset Date to adjust to DST in Java 【发布时间】:2012-06-19 13:21:15 【问题描述】:

我有一份用 Java 编写的工作,该工作每天在该时区的指定时间运行。例如,如果我在 0800 时第一次开始工作,它必须每天在同一时间运行工作。如果时区不遵循 DST,这可以正常工作。但如果它遵循 DST,它就会中断。

例如,如果我在 0800 PST 第一次开始工作,只要 DST 未生效,它必须始终在 UTC 0000 小时内运行,但如果 DST 生效,则应移至前一天 2300 小时 UTC .如何针对这些 DST 更改以编程方式调整我的工作开始时间。

我的输入如下所示:

String startdate = "2012-06-16T08:00:00"
String timeZone = "PST";

这些将是位于配置文件中的常量,一旦设置就无法修改。无论 DST 是否生效,输入都会 PST。

因此,如果当前时区在 PST 中,它将在 UTC 2012-06-16 的 0000 小时运行,否则它将在 UTC 2012-06-15 的 2300 小时运行。

我如何做到这一点。

注意:这不是家庭作业问题,而且我来自不遵循 DST 的地区,所以对我来说有点困惑。

提前致谢。

【问题讨论】:

【参考方案1】:

我不知道您是如何安排工作的,但如果您手动计算下一个执行日期,您可以使用java.util.Calendar,如下所示:

TimeZone tz = TimeZone.getTimeZone( timeZone );
SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss" );
dateFormat.setTimeZone( tz );
Calendar cal = Calendar.getInstance();
cal.setTimeZone( tz );
cal.setTime( dateFormat.parse( startdate ) );

然后在每次执行作业后,您可以计算作业的下一次运行时间:

cal.add( Calendar.DAY_OF_YEAR, 1 );

这增加了一个日历日,而不是 24 小时。因此,如果开始日期是当地时间上午 8 点,那么即使在 DST 期间,它将继续在当地时间上午 8 点运行。日历会为您处理 DST 转换。

【讨论】:

以上是关于如何在 Java 中偏移日期以适应 DST的主要内容,如果未能解决你的问题,请参考以下文章

确定夏令时 (DST) 在 Java 中是不是在指定日期处于活动状态

检测 C++ 中的 DST 更改

如何在 .NET 中的 DST 时间获取 UTC 偏移量

用 momentJS 正确处理 DST 偏移

如何显示 dst 空闲时区偏移量?

将 UTC 偏移量转换为时区或日期