我希望将UTC TimeDate邮票字符串转换为毫秒的整数值(可能需要64位数量),以便在存储在mySQL数据库列中时占用更少的空间。这个UTC字符串是从另一个库生成的,我将它存储为一种每个用户的GUID。
datetime或dateutil能否将其转换为单个整数值(如“自纪元以来的毫秒”)?还是我需要自己去做?
使用这种方法进行分析:
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毫秒。
发布于 2015-06-28 05:10:06
在评论中根据建议编辑
使用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相当于:Sat,2015年6月27日格林尼治标准时间02:10:05 (如预期)
我们还可以使用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相当于:Sat,2015年6月27日,格林尼治时间09:10:05 (我在圣地亚哥的mac电脑上;Note:这比我们预期的差7小时)。
该错误的原因由J.F. Sebastian在上述链接的注释和this关于.strftime('%s')行为的答复中描述。J.F. Sebastian指出,“它不受支持,不可移植,它可能会为一个感知的datetime对象默默地产生错误的结果,如果输入为UTC (如问题中所示),但本地时区不是UTC,则会失败”。
发布于 2015-06-28 20:12:29
有两部分:
"2015-06-27T02:10:05.653000Z"转换为日期时间对象,请参见How to parse ISO formatted date in Python?
从日期时间导入日期时间utc_time = datetime(*map(int,re.findall(r'\d+',time_string))发布于 2015-06-28 04:32:19
斯科特和GordonLinoff在解决我的问题上都提供了很好的帮助。我要加一个完整的答案。
Python代码将UTC日期时间字符串转换为自纪元以来的毫秒:
编辑以消除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))另外:如果我将列定义为DATETIME(6)数据类型,mysql将直接从字符串接受一个带有毫秒/微秒的日期时间值:
UPDATE myTable SET myDateTimeField = '2015-06-27T02:10:05.653000Z'请注意,在UTC datetime字符串末尾包含"Z“将导致mysql发出截断警告。
我无法确定日期时间(6)的添加精度是否导致mysql的InnoDB引擎使用8字节以上,这是我研究这个问题的最初原因之一。
https://stackoverflow.com/questions/31095321
复制相似问题