我有一个看似简单的问题,但我找不到直截了当的答案。我想写一个函数,它接受两个字符串作为输入,并给出一个整数作为输出。
在R中,函数将如下:
utc_seconds = function(date_string, tz) as.integer(as.POSIXct(date_string, tz = tz))
我掌控date_string
,并知道格式永远是正确的,例如2018-02-11 00:00:00
,我也知道tz
将始终位于Olson format。
输入/输出示例:
utc_seconds('2018-02-11 00:00:00', tz = 'Asia/Singapore')
# 1518278400
我已查看datetime
,pytz
,time
等的各种组合/排列,但无济于事。 This表看起来很有希望,但最终我无法弄清楚如何使用它。
我管理过" hack"如下所示,但这感觉很麻烦(在我的输入字符串中添加了无关的信息):
from dateutil.parser import parse
from dateutil.tz import gettz
parse("2018-02-01 00:00:00 X", tzinfos={'X': gettz('Asia/Singapore')})
# datetime.datetime(2018, 2, 11, 0, 0, tzinfo=tzfile('/usr/share/zoneinfo/Asia/Singapore'))
但我也无法在UTC时间到达。
答案 0 :(得分:1)
您可以使用日期时间timestamp
来获取纪元时间
from datetime import datetime
import pytz
def utc_seconds(str_dt, timezone):
timezone = pytz.timezone(timezone)
dt = datetime.strptime(str_dt, '%Y-%m-%d %H:%M:%S')
dt_timezone = timezone.localize(dt)
return int(dt_timezone.timestamp())
utc_seconds('2018-02-11 00:00:00', 'Asia/Singapore')
# 1518278400
答案 1 :(得分:0)
在@Udayraj Deshmukh的推动下,我拼凑了以下内容:
from dateutil.parser import parse
from pytz import timezone, utc
from datetime import datetime
def utc_seconds(input, tz):
tz = timezone(tz)
dt = tz.localize(parse(input), is_dst = None)
return int((dt - datetime(1970, 1, 1, tzinfo = utc)).total_seconds())
utc_seconds('2018-02-11 00:00:00', 'Asia/Singapore')
# 1518278400
由于我的设置已经与Spark背景相关联的愉快情况,我也想出了以下替代方案:
def utc_seconds(input, tz):
query = "select unix_timestamp(to_utc_timestamp('{dt}', '{tz}'))" \
.format(dt = input, tz = tz)
return spark.sql(query).collect()[0][0]
(即,将罐子踢成更友好的语言并收集结果)