​ 在airflow中使用的时间是utc时间,而更多时候我们希望的是使用本地时间,于是在定义airflow定时任务的时候,涉及到了时间的转换。

1.python中本地时间和utc时间的转换

查看国内可用时区:

>>> import pytz
>>> pytz.country_timezones('cn')
['Asia/Shanghai', 'Asia/Urumqi']

方式一:

修改配置文件airflow.conf使用操作系统时间

[core]
default_timezone=system

方式二:

tz = pytz.timezone('Asia/Shanghai')
naive = datetime.strptime("2018-06-13 17:40:00", "%Y-%m-%d %H:%M:%S")
local_dt = tz.localize(naive, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)

参考链接: https://stackoverflow.com/questions/79797/how-do-i-convert-local-time-to-utc-in-python

方式三:

tz = pytz.timezone('Asia/Shanghai')
dt = datetime(2018, 6, 13, 17, 40, tzinfo=tz)
utc_dt = dt.astimezone(pytz.utc)

2.Airflow中通过时间转换使用本地时间

这里涉及到一个问题,如果只是将本地时间转换成了utc时间,那么在运行过程中airflow会抛出以下错误:

Can't subtract offset-naive and offset-aware datetimes

解决办法是当将时间转换为utc时间之后将其时区属性设为None:

 dt.replace(tzinfo=None)

参考链接: https://stackoverflow.com/questions/796008/cant-subtract-offset-naive-and-offset-aware-datetimes

完整示例DAG如下:

import time
import airflow
import pytz
from airflow.operators.python_operator import PythonOperator
from airflow.models import DAG
from datetime import timedelta, datetime default_args = {
'owner': 'cord',
'depends_on_past': True,
'email': ['123456@qq.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
} tz = pytz.timezone('Asia/Shanghai')
# naive = datetime.strptime("2018-06-13 17:40:00", "%Y-%m-%d %H:%M:%S")
# local_dt = tz.localize(naive, is_dst=None)
# utc_dt = local_dt.astimezone(pytz.utc).replace(tzinfo=None) dt = datetime(2018, 6, 13, 17, 40, tzinfo=tz)
utc_dt = dt.astimezone(pytz.utc).replace(tzinfo=None) dag = DAG(
'demo',
default_args=default_args,
description='my DAG',
schedule_interval='* */3 * * *',
start_date=utc_dt
) def test_func(str):
print(str) task = PythonOperator(
task_id='hello',
python_callable=test_func,
op_kwargs={'str': 'hello world'},
dag=dag
)

airflow使用本地时区的更多相关文章

  1. 将celery定时任务设置为根据本地时区触发

    默认celery的时区为UTC,如果要在django项目中将celery定时任务配置为根据本地时区触发,则需要修改 在setttings.py 添加以下任意一行: # celery 相关配置 CELE ...

  2. Python 将一个时间戳格式化为(格林威治时间或者本地时区时间)

    时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. 获取一个时间戳 import time times = time. ...

  3. python中快速获取本地时区当天0点时间戳的一种方法

    如下所示,看了网上的几种方法,这种方法算是代码量比较小的,同时可以保证求的是本地时区的0点时间戳,返回的是浮点数,需要的话自己转一下int In [1]: import time In [2]: fr ...

  4. ntpdate 设置时区(注意本地时区要设置正确)

    修改timezone sudo cp -a /usr/share/zoneinfo/Etc/GMT-8  /etc/localtime date -R   == 展示当前的timezone ntpda ...

  5. ISO日期格式标准,浏览器到服务器到mysql中的时区

    时区简单理解 https://zh.wikipedia.org/wiki/%E6%97%B6%E5%8C%BA 上面的链接是时区的wiki说明,下面说说我记住的部分: GMT时区是格林威治标准时间,我 ...

  6. 时间戳 时区 java mysql

    当一个时间 比如2016年5月6日,生成时间戳.这个运算是与时区有关的.首先得确认这个时间是哪个时区的,然后转换成utc时区的时间.再减去1970,得到的秒数,就是时间戳. 时间戳是个一定的值,他与时 ...

  7. ELK系统中kibana展示数据的时区问题

    在采用ELK记录系统日志时,日志存入elasticsearch时,一般是以本地时区存入(如北京东8区) 在elasticsearch中直接查询时也没有任何问题,但是kibana在做日志展示时,对日志时 ...

  8. javascript通过时区获取时间

    /* 描述:时区的换算 参数:offset时区位置 使用:东八区calcTime(”+8"); */ function calcTime(offset) { // 创建一个本地日期 var ...

  9. ruby -- 基础学习(三)设置中国时区时间

    Rails连接MYSQL数据库,默认显示UTC时间.如果想要改成中国时区时间,按照下面修改: 在config/application.rb中找到 class Application < Rail ...

随机推荐

  1. CodeForces 939F Cutlet

    洛谷题目页面传送门 & CodeForces题目页面传送门 题意见洛谷里的翻译. 这是一道毒瘤的div. 2 F,我是不可能比赛的时候做出来的... (以下设两面都要煎\(n\)分钟,有\(m ...

  2. 自己动手实现MQTT协议

    写在前面 前段时间弄IoT相关的东西,系统学习了一下 MQTT 协议,在此分享出来. 本文先是对 MQTT 协议做了简单的介绍:接着是对 MQTT协议的内容做了较为全面的解读:最后使用 Python ...

  3. PHP 数组转字符串后仍保留数组格式

    写此方法的目的是,我想把一个PHP数组配置文件读进程序,添加些配置,然后在写入文件: var_export 方法会把原来的配置打乱(比如数组序号我没有加,他自动给我加上 0,1,2,3...),而且格 ...

  4. Java进程故障排查

    故障分析 # 导致系统不可用情况(频率较大): 1)代码中某个位置读取数据量较大,导致系统内存耗尽,进而出现Full GC次数过多,系统缓慢: 2)代码中有比较消耗CPU的操作,导致CPU过高,系统运 ...

  5. 使用react定义组件的两种方式

    react组件的两种方式:函数定义,类定义 在定义一个组件之前,首先要明白一点:react元素(jsx)是react组件的最基本的组成单位 组件要求: 1,为了和react元素进行区分,组件名字首必须 ...

  6. Python 基础1 - 位运算符

    引言 本文主要介绍位运算符,实际上Python有以下7类运算符: [赋值运算符].[比较运算符].[算术运算符].[逻辑运算符].[身份运算符].[成员运算符].[位运算符] 位运算符 按位运算符是把 ...

  7. ASP.NET Core实现对象自动映射-AgileMapper

    我们为什么要在对象之间做映射 处于耦合性或者安全性考虑或者性能考虑我们不希望将Model模型传递给他们,我们会在项目中创建一些DTO(Data transfer object数据传输对象),进行数据的 ...

  8. 05_指针之New()函数的使用

    1.new函数是一个内置函数,表达式new(T)创建一个未命名的T类型变量,初始化为T类型的零值,并返回其地址(地址类型为*T)2.p:=new(int),q:=new(int)==>p!=q ...

  9. CAS及其ABA问题

    CAS.volatile是JUC包实现同步的基础.Synchronized下的偏向锁.轻量级锁的获取.释放,lock机制下锁的获取.释放,获取失败后线程的入队等操作都是CAS操作锁标志位.state. ...

  10. Linux之Shell编程(16)

    读取从控制台输入的值(read): 系统函数: basename:返回完整路径最后/部分,常用于获取文件名 basename [pathname] [suffix] dirname:返回完整路径最后/ ...