我想将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。
答案 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)
分为两部分:
将"2015-06-27T02:10:05.653000Z"
转换为日期时间对象,请参阅How to parse ISO formatted date in Python?
import re
from datetime import datetime
utc_time = datetime(*map(int, re.findall(r'\d+', time_string))
将UTC时间转换为POSIX时间戳为整数毫秒,请参阅How can I convert a datetime object to milliseconds since epoch (unix time) in Python?
from datetime import datetime
def timestamp_millis(utc_time, epoch=datetime(1970, 1, 1)):
td = utc_time - epoch
return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) // 10**3
答案 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个字节,这是我研究该问题的最初原因之一。