簡體   English   中英

在Python中將微秒時間戳轉換為datetime

[英]Convert microsecond timestamp to datetime in Python

我正在從Google Chrome中提取Cookie到期日期。 從它的外觀來看,Chrome正在使用時間戳存儲Cookie過期,該時間戳使用1601-01-01 00:00:00 UTC作為紀元。 我目前的實施如下:

stamp = int(result[3])
date = datetime.datetime.fromtimestamp(stamp / 10000000.0)
print date.year

然而,這產生了錯誤的日期(約一年)。 我在這做錯了什么?

另一種選擇,從Python 3.2開始從標准庫中獲取tzinfo (對於較舊的Python版本,如果來自pytzpytz ):

>>> import pytz
>>> from datetime import datetime, timedelta, timezone
>>> epoch = datetime(1601, 1, 1, tzinfo=timezone.utc)
>>> cookie_microseconds_since_epoch = 13022344559000000
>>> cookie_datetime = epoch + timedelta(microseconds=cookie_microseconds_since_epoch)
>>> str(cookie_datetime)
'2013-08-29 13:55:59+00:00'

我假設與期望值的差異是時區偏移量。

更新:

正如@JFSebastian正確指出的那樣,如果你使用隱式UTC 天真 datetime對象, tzinfo是多余的,上面的內容可以簡化為:

>>> from datetime import datetime, timedelta
>>> epoch = datetime(1601, 1, 1)
>>> cookie_microseconds_since_epoch = 13022344559000000
>>> cookie_datetime = epoch + timedelta(microseconds=cookie_microseconds_since_epoch)
>>> str(cookie_datetime)
'2013-08-30 13:55:59'

我不確定你開始的數據是什么,但這里是一個從整數時間戳開始的例子。 假設pytz模塊存在(我高度推薦)。

>>> import datetime, pytz
>>> x = datetime.datetime.fromtimestamp(0)
>>> x = x.replace(tzinfo=pytz.UTC)
>>> str(x)
'1970-01-01 00:00:00+00:00'
>>> d = datetime.timedelta(365 * (1970 - 1601))
>>> str(x - d)
'1601-03-31 00:00:00+00:00'
>>> d = datetime.timedelta(365 * (1970 - 1601) + 31 + 28 + 31 - 1)
>>> str(x - d)
'1601-01-01 00:00:00+00:00'
>>> str(d)
'134774 days, 0:00:00'

所以你有它。 1601年1月1日和1970年1月1日之間的轉換是134774天。

為什么這么多天? 閏年! 我們增加了一定天數,而不是幾年。 (實際上, timedelta對象不直接支持添加年份 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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