首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Python DateTime字符串转换为整数毫秒

将Python DateTime字符串转换为整数毫秒
EN

Stack Overflow用户
提问于 2015-06-28 01:37:56
回答 3查看 8.3K关注 0票数 2

我希望将UTC TimeDate邮票字符串转换为毫秒的整数值(可能需要64位数量),以便在存储在mySQL数据库列中时占用更少的空间。这个UTC字符串是从另一个库生成的,我将它存储为一种每个用户的GUID。

datetime或dateutil能否将其转换为单个整数值(如“自纪元以来的毫秒”)?还是我需要自己去做?

使用这种方法进行分析:

代码语言:javascript
复制
myDateTime = dateutil.parser.parse("2015-06-27T02:10:05.653000Z")
print("Parsed datetime String is {0}, ordinal value is {1}".format(myDateTime, myDateTime.toordinal()))

给出输出:

代码语言:javascript
复制
Parsed datetime String is 2015-06-27 02:10:05.652999+00:00, ordinal value is 735776

…它只给出日期的序号值。此外,如果我有一个整数为653毫秒的时间,那么我希望被解析的对象知道它有653毫秒,而不是652999毫秒。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-28 05:10:06

在评论中根据建议编辑

使用Ben Alpert's回答How can I convert a datetime object to milliseconds since epoch (unix time) in Python,我们可以执行以下操作:

代码语言:javascript
复制
from datetime import datetime
def unix_time(dt):
    epoch = datetime.utcfromtimestamp(0)
    delta = dt - epoch
    return delta.total_seconds()

def unix_time_millis(dt):
    return int(unix_time(dt) * 1000)

a = datetime.strptime("2015-06-27T02:10:05.653000Z", "%Y-%m-%dT%H:%M:%S.%fZ")
unix_time_millis(a)

返回:

代码语言:javascript
复制
1435371005653

相当于:Sat,2015年6月27日格林尼治标准时间02:10:05 (如预期)

我们还可以使用datetime的.strftime('%s')获得unix时间,甚至可以使用以下几毫秒(,但不建议使用):

代码语言:javascript
复制
from decimal import Decimal

int(Decimal(datetime.strptime("2015-06-27T02:10:05.653000Z", "%Y-%m-%dT%H:%M:%S.%fZ").strftime('%s.%f'))*1000)

返回:

代码语言:javascript
复制
1435396205653

相当于:Sat,2015年6月27日,格林尼治时间09:10:05 (我在圣地亚哥的mac电脑上;Note:这比我们预期的差7小时)。

该错误的原因由J.F. Sebastian在上述链接的注释和this关于.strftime('%s')行为的答复中描述。J.F. Sebastian指出,“它不受支持,不可移植,它可能会为一个感知的datetime对象默默地产生错误的结果,如果输入为UTC (如问题中所示),但本地时区不是UTC,则会失败”。

票数 6
EN

Stack Overflow用户

发布于 2015-06-28 20:12:29

有两部分:

票数 1
EN

Stack Overflow用户

发布于 2015-06-28 04:32:19

斯科特和GordonLinoff在解决我的问题上都提供了很好的帮助。我要加一个完整的答案。

Python代码将UTC日期时间字符串转换为自纪元以来的毫秒:

编辑以消除strftime:

代码语言:javascript
复制
from datetime import datetime

def convert_UTC_zulu_string_to_milliseconds_since_epoch(myUTCzuluString):
    try:
        dt_unix = datetime.strptime(myUTCzuluString, "%Y-%m-%dT%H:%M:%S.%fZ")
        epoch = datetime.utcfromtimestamp(0)
        delta = dt_unix - epoch
        millisecondsSinceEpoch = long(delta.total_seconds() * 1000)

    except:
        millisecondsSinceEpoch = 0L

    return millisecondsSinceEpoch


myUTCzuluString = "2015-06-27T02:10:05.653000Z"
millisecondsSinceEpoch = convert_UTC_zulu_string_to_milliseconds_since_epoch(myUTCzuluString)
print("Milliseconds since epoch: {0}".format(millisecondsSinceEpoch))

另外:如果我将列定义为DATETIME(6)数据类型,mysql将直接从字符串接受一个带有毫秒/微秒的日期时间值:

代码语言:javascript
复制
UPDATE myTable SET myDateTimeField = '2015-06-27T02:10:05.653000Z'

请注意,在UTC datetime字符串末尾包含"Z“将导致mysql发出截断警告。

我无法确定日期时间(6)的添加精度是否导致mysql的InnoDB引擎使用8字节以上,这是我研究这个问题的最初原因之一。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31095321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档