LoginSignup
0
0

PythonでMD Dos日時をパースする

Last updated at Posted at 2023-09-11

MS Dos日時とは何か

zipファイルのバイナリなどで日時を表すために用いられる。
時刻と日付それぞれで2バイトの16進数で表す。

MSDosDateTime.png

Pythonコード

MS Dos日付をパースするコードは以下の通り。
引数は2バイトのMS Dos日付をリトルエンディアンで取得して整数に変換したものとする。

#int_ms_dos_date is 2-Byte or lower integer
def get_date_from_ms_dos_date(int_ms_dos_date):
    #Convert to 16 bit fixed length binary string
    str_bin_ms_dos_date = format(int_ms_dos_date, '0>16b')
    year = int(str_bin_ms_dos_date[0:7],2) + 1980
    month = int(str_bin_ms_dos_date[7:11],2)
    day = int(str_bin_ms_dos_date[11:16],2)
    return(f"{year}/{month}/{day}")

MS Dos時刻をパースするコードは以下の通り。
引数は2バイトのMS Dos時刻をリトルエンディアンで取得して整数に変換したものとする。

#int_ms_dos_time is 2-Byte or lower integer
def get_time_from_ms_dos_time(int_ms_dos_time):
    #Convert to 16 bit fixed length binary string
    str_bin_ms_dos_time = format(int_ms_dos_time, '0>16b')
    hour = int(str_bin_ms_dos_time[0:5],2)
    minute = int(str_bin_ms_dos_time[5:11],2)
    second = int(str_bin_ms_dos_time[11:16],2) * 2
    return("%(num1)02d:%(num2)02d.%(num3)02d" % {"num1":hour,"num2" : minute,"num3":second})

使い方

import struct

with open(zip_file_name, 'rb') as zip_file:
    data = zip_file.read(14)
    fields = struct.unpack('<IHHHHH', data[0:14])
    #get a little-endian Dos-Date-Time value as integer
header_signature,version,bit_flag,compression_method,int_last_modification_time,int_last_modification_date = fields

    #get result as a string
    last_modification_date = get_date_from_ms_dos_date(int_last_modification_date)
    last_modification_time = get_time_from_ms_dos_time(int_last_modification_time)

ハマったところ

フォーマット情報を見つけることができたが、内容があまり理解できなかった。
→具体的にサンプルを作って理解した。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0