[英]Conversion of Python DateTime string into integer milliseconds
我想將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。
[根據評論中的建議進行編輯]
使用Ben Alpert對我如何將日期時間對象轉換為自epoch(unix時間)以來的毫秒數 的答案,我們可以執行以下操作:
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日,星期六,格林尼治標准時間 (如預期)
我們還可以使用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日,星期六,格林尼治標准時間 (在我位於聖地亞哥的Mac上; 請注意 :這比我們預期的要晚 7個小時)。
錯誤的原因是由JF塞巴斯蒂安在上面和鏈接的評論描述這個答案就.strftime('%s')
行為。 JF Sebastian指出“不支持它,它不是可移植的,它可能會為已知的日期時間對象默默地產生錯誤的結果,如果輸入使用UTC(如在問題中),但是本地時區不是UTC,則它將失敗”
有兩個部分:
將"2015-06-27T02:10:05.653000Z"
轉換為日期時間對象,請參見如何在Python中解析ISO格式的日期?
import re from datetime import datetime utc_time = datetime(*map(int, re.findall(r'\\d+', time_string))
要將UTC時間轉換為POSIX時間戳(以整數毫秒為單位),請參見如何將datetime對象轉換為自epoch(unix時間)以來的毫秒?
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
Scott和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日期時間字符串的末尾包含“ Z”會導致mysql發出截斷警告。
我無法確定DATETIME(6)超過DATETIME的精度是否導致mysql的InnoDB引擎使用8個以上的字節,這是我研究此問題的最初原因之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.