簡體   English   中英

將Python DateTime字符串轉換為整數毫秒

[英]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,則它將失敗”

有兩個部分:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM