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

时间:2015-06-28 01:37:57

标签: python mysql python-2.7 datetime datetime-format

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

datetime或dateutil可以将其转换为单个整数值(例如“epoch”以来的毫秒数)吗?或者我自己需要这样做?

使用这种方法进行解析:

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

给出输出:

Parsed datetime String is 2015-06-27 02:10:05.652999+00:00, ordinal value is 735776

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

3 个答案:

答案 0 :(得分:3)

[以下评论中的建议编辑]

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

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)

返回:

1435371005653

相当于:星期六,2015年6月27日02:10:05 GMT (正如所料)

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

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)

返回:

1435396205653

相当于:星期六,2015年6月27日09:10:05 GMT (在我在圣地亚哥的Mac上; 注意:这是我们可能有7个小时的休息时间预期)。

J.F. Sebastian在上述链接的评论和this关于.strftime('%s')行为的回答中描述了错误的原因。 JF Sebastian指出“它不受支持,它不可移植,它可能会默默地为一个有意识的日期时间对象产生错误的结果,如果输入是UTC(如问题中),它会失败,但本地时区不是UTC”< / p>

答案 1 :(得分:1)

分为两部分:

答案 2 :(得分:0)

Scott和GordonLinoff都在解决我的问题方面提供了很好的帮助。我正在为完整性添加答案。

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

编辑消除strftime:

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))

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

UPDATE myTable SET myDateTimeField = '2015-06-27T02:10:05.653000Z'

请注意,在UTC日期时间字符串末尾包含“Z”会导致mysql发出截断警告。

我无法确定DATETIME(6)相对于DATETIME的精度是否导致mysql的InnoDB引擎使用超过8个字节,这是我研究该问题的最初原因之一。