气流时区从UTC更改为CET

2024-04-26 18:42:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在airflow中运行一个dag,其执行日期应为CET,但默认情况下airflow运行的是UTC。。所以如果我想在变量中使用TS或EXECUTION-DATE的值。。。它以UTC显示当前时间。。如何在CET时区获取执行日期


Tags: date时间情况airflowutcdagexecutionts
3条回答
EXEC_DATE = "{{ (execution_date + macros.timedelta(hours=1)).strftime('%Y%m%d%H%M')}}"

这将给{ts}}增加一个小时的时间,并且会像CET:)一样工作

对于当前版本的Airflow(1.10.x),它们需要模块pendulum,因为对timezone aware scheduling的支持有限。在

TSEXECUTION_DATE的宏值被(iirc)设置为气流系统的UTC时区,因为这是气流在保存到数据库并显示UI时将所有内容转换为的内容。您可能希望在配置中更改此设置:

[core]
default_timezone = utc

可能会影响这一点,但它似乎只会影响对原始日期时间的理解(例如,如果将DAG start_date设置为Datetime(2018,12,25),则假定它在default_timezone中)

您可以像这样在PythonOperator中转换DAG中的execution_date

^{pr2}$

因为execution_date已经知道它是UTC格式,所以转换应该是准确的。请注意,这不会将其分配给任何对象,也不会更改execution_date。在

如果你在当地时间(未知时区)工作,会发生以下情况:

>>> import pendulum
>>> dtz=pendulum.timezone("Europe/Amsterdam")
>>> dtz
Timezone('Europe/Amsterdam')
>>> import datetime
>>> d=datetime.datetime.now()
>>> d
datetime.datetime(2018, 12, 17, 17, 36, 5, 435666)
>>> dtz.convert(d)  # Notice unchanged
datetime.datetime(2018, 12, 17, 17, 36, 5, 435666, tzinfo=Timezone('Europe/Amsterdam'))
>>> d
datetime.datetime(2018, 12, 17, 17, 36, 5, 435666)
>>> dtz.convert(pendulum.timezone("UTC").convert(d))  # Notice changed
datetime.datetime(2018, 12, 17, 18, 36, 5, 435666, fold=1, tzinfo=Timezone('Europe/Amsterdam'))
>>> d  # Notice change not assigned
datetime.datetime(2018, 12, 17, 17, 36, 5, 435666)

所以…我希望这有帮助,因为CET与UTC IIRC有一个可变的偏移量。在

有一个很酷的库叫做arrow,可以用来将时间从一个时区转换到另一个时区

>>> import arrow
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2018-12-15T20:50:33.156717+00:00]>
>>> local = utc.to('CET')
>>> local
<Arrow [2018-12-15T21:50:33.156717+01:00]>

只有内置库的方式

^{pr2}$

如果你想恢复iso格式

>>> cet_ts.isoformat()
'2018-12-16T02:05:00'

编辑:

要转换ISO8601格式的字符串,可以使用以下命令

>>> ts = '2018-12-15T21:10:00+00:00'
>>> arrow.get(ts)
<Arrow [2018-12-15T21:10:00+00:00]>

要将日期从UTC转换为CET,只需运行

>>> utc.to('CET')
<Arrow [2018-12-15T22:10:00+01:00]>

相关问题 更多 >