3

これで私を助けてくれることを本当に願っています。別のプログラムでアクセスできるようにする必要がある Python プログラムによって出力された日付があります。

問題は、この日付がどのようにフォーマットされているか分からないことです:

Format               Date
129893779638930000 - 2012-08-13 17:32:43

それは日付と時刻の両方であり、私はPythonをよく知らないので、誰かがそれがどのような形式であるかを認識することを本当に望んでいます. UNIXタイムスタンプに変換する方法を教えていただければボーナスポイントです。

編集: これを行うプログラムは、Foobar2000 (音楽プログラムの拡張機能) のコンポーネントです。コンポーネントはhttp://www.foobar2000.org/components/view/foo_playcountに示されています。これは、奇妙な日付/タイムスタンプを生成する XML エクスポート機能です。

4

3 に答える 3

10

1298936786262160001e-8 秒 (数十ナノ秒) の UNIX タイムスタンプのように見えます: 1,298,936,786.262,160,00。それは次のことを表します:

>>> from datetime import datetime
>>> datetime.utcfromtimestamp(129893678626216000/1e8)
datetime.datetime(2011, 2, 28, 23, 46, 26, 262160)

編集:ただし、あなたの情報「ファイル時間は、1601 年 1 月 1 日午前 12:00 から経過した 100 ナノ秒間隔の数を表す 64 ビット値です。協定世界時 (UTC)」を使用するように指示されています。

>>> from datetime import datetime, timedelta
>>> datetime(1601, 1, 1, 0, 0, 0) + timedelta(seconds = 129893678626216000/1e7)
datetime.datetime(2012, 8, 13, 21, 44, 22, 621599)

あなたが待っていたものを正確に手に入れる場所。

UNIX タイムスタンプ (1970-01-01 00:00:00 UTC からの秒数) に直接変換することもできます。

>>> 129893678626216000 / 1e7 - 11644473600
1344894262.6215992
于 2012-08-14T07:02:25.220 に答える
2

Windowsファイル時間のようです:

ファイル時刻は、協定世界時 (UTC) 1601 年 1 月 1 日午前 12:00 から経過した 100 ナノ秒間隔の数を表す 64 ビット値です。システムは、アプリケーションがファイルを作成、アクセス、書き込みするファイル時刻を記録します。NTFS ファイル システムは時刻の値を UTC 形式で保存するため、タイム ゾーンや夏時間の変更の影響を受けません。FAT ファイル システムは、コンピュータのローカル時間に基づく時間値を格納します。たとえば、ワシントンの PST 午後 3:00 に保存されたファイルは、NTFS ボリュームではニューヨークの EST 午後 6:00 として表示されますが、FAT ボリュームではニューヨークの EST 午後 3:00 として表示されます。

FILETIME 構造体も参照してください。

重要な点は、時刻が UTC とローカル タイムゾーンの両方である可能性があることです。FAT ファイルシステムが存在する可能性がある場合。プラグインがファイルタイムを変換せずにディスクから直接読み取るかどうかを確認して、ローカルタイムゾーンを考慮する必要があるかどうかを確認してください。

UTC の場合 ( C++ の回答を適応):

WINDOWS_TICK_INTERVAL  = 100e-9 # 100 nanoseconds intervals
SEC_TO_UNIX_EPOCH = (datetime(1970, 1, 1) - datetime(1601, 1, 1)).total_seconds()
# -> 11644473600

def WindowsTickToUnixSeconds(windowsTicks):
    return windowsTicks * WINDOWS_TICK_INTERVAL - SEC_TO_UNIX_EPOCH

datetimeオブジェクトに変換するには:

from datetime import datetime

filetime = 129893779638930000
dt = datetime.utcfromtimestamp(WindowsTickToUnixSeconds(filetime))
print(dt.strftime("%Y-%m-%d %H:%M:%S.%f-00:00"))
# -> 2012-08-14 00:32:43.893000-00:00

あなたの質問の時間に対応しているようです:(2012-08-13 17:32:43-07:00おそらくPDT)。

過去からローカル タイムゾーン (FAT から) でファイル時間の DST を処理するには、 pytz ライブラリが必要になる場合があります。

于 2012-08-14T10:18:52.710 に答える
1

ファイルタイムは UNIX タイムスタンプに似ていますが、1601 年 1 月 1 日の午前 0 時から測定されるため、適切な秒数を引いて秒で割ると UNIX タイムスタンプが得られます。これを試してください。(FILETIME - 116444736000000000) / 10000000

于 2012-08-14T07:23:00.350 に答える