我一直在运行airflow 1.9.0,并使用动态生成的计划间隔。
简单地说,我从一些配置文件中获取美国/东部时间戳,获取当前系统时区(可以是EDT或EST),并将其转换为UTC时间,然后转换为cron表达式。
例如,如果我今天(美国东部时间2018年7月23日,美国东部时间)启动dag,而我的输入是美国东部时间上午6点,则将导致dag的计划时间间隔是UTC或0 10 * * 1-5
。 / p>
我的问题是:
如果我每天停止运行,那么夏令时结束时,它的时间表是否会在11月自动更新为0 11 * * 1-5
?
我特别想避免在安排这些dag时使用可感知tz的日期时间,这就是为什么我想出了这种怪诞的时间戳转换方式。
答案 0 :(得分:3)
您使用什么库或代码在东部时间戳之间进行转换并生成cron表达式?我认为回答问题的这一部分取决于该信息。
无论如何,这种想法对我来说听起来像是一种代码气味。尽管从技术上讲这是可行的,但前提是您的库正确支持了该用例,并且时区库保持最新,但我认为最好采用确定预定的crontab时间表并使用它的标准方法始终如此。
例如,在将服务器从东部迁移到太平洋或在不同时区操作多台服务器的情况下,最好不要使用本地时区。在任何地方都使用UTC可使您在扩展时保持简单。< / p>
由于UTC没有夏令时,因此这可以帮助您避免DST错误(如果不使用UTC则必须解决)之类的问题。
此外,Airflow官方文档建议不要使用幼稚的日期时间:
因为Airflow使用了时区感知日期时间对象。如果您的代码创建了日期时间对象,则它们也需要注意。
...
尽管Airflow可以完全识别时区,但仍可接受DAG定义中start_dates和end_dates的原始日期时间对象。这主要是为了保持向后兼容性。
...
不幸的是,在DST过渡期间,某些日期时间不存在或不明确。在这种情况下,摆会引发例外情况。因此,当启用时区支持时,您应该始终创建可识别的日期时间对象。
https://github.com/apache/incubator-airflow/blob/master/docs/timezone.rst
您能详细说明使用朴素的日期时间与时区感知日期时间的用例吗?我很乐意为此添加更多具体建议。