【问题标题】:Convert datetime string, timezone to epoch seconds将日期时间字符串、时区转换为纪元秒
【发布时间】:2018-03-16 11:53:34
【问题描述】:

我有一个看似简单的问题,但我找不到直接的答案。我想写一个函数,输入两个字符串,输出一个整数。

在 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

我查看了datetimepytztime 等的各种组合/排列,但无济于事。 This table 看起来很有希望,但最终我无法弄清楚如何使用它。

我已经管理了一个“黑客”如下,但这感觉很无聊(向我的输入字符串添加无关信息):

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 时间。

【问题讨论】:

  • 这不是你想要的吗?????? stackoverflow.com/questions/12165691/…
  • 不完全是——我没有datetime 对象作为输入(引用答案中的datetime(2012, 8, 28, 19, 33, 50)
  • @UdayrajDeshmukh 可以将答案整合到工作中;感觉很丑,真的是最简单的方法吗? (pytz.timezone('Asia/Singapore').localize(parse("2018-02-11 00:00:00"), is_dst = None) - datetime.datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()

标签: python datetime timezone utc


【解决方案1】:

您可以使用 datetime 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

【讨论】:

  • 不知道我是怎么在搜索中错过了timestamp,谢谢,干净多了。
【解决方案2】:

在@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]

(即,将罐子踢成更友好的语言并收集结果)

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 2018-02-18
    • 2012-11-22
    • 2014-11-18
    • 2017-11-10
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多