9

Google Chrome から Cookie の有効期限を取得しています。どうやら、Chrome は 1601-01-01 00:00:00 UTC をエポックとして使用するタイムスタンプで Cookie の有効期限を保存しています。私の現在の実装は次のとおりです。

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

ただし、これは間違った日付を生成しています (約 1 年ずれています)。ここで何が間違っていますか?

4

2 に答える 2

12

Python 3.2 以降の標準ライブラリから取得する別のオプションtzinfo(古い Python バージョンの場合は、から取得できますpytz):

>>> 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'
于 2012-09-25T20:52:08.400 に答える
2

どのデータから始めているのかわかりませんが、整数のタイムスタンプから始まる例を次に示します。モジュールが存在すると仮定し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

于 2012-09-25T20:24:53.300 に答える