2013年3月18日月曜日

Windows時間をローカル時間に変換

UNIX系OS(C言語なども)は、1970年1月1日0時0分0秒 からの秒数をシステム時刻としてもっています。 一方、Windowsでは、1601年1月1日0時0分 からの経過時刻を 100ナノ秒単位 で持っているそうです。 ActiveDirectryの情報をPerlで取得したりすると、最終ログイン日時やパスワード変更日時が上記の秒数になって表示されているので、変換する必要があります。 Perlで書くと以下のようになります。 #!/usr/bin/perl $time = shift(@ARGV); #100ナノ秒単位なので秒に変換 $time = int($time / 10000000); #1601年1月1日0時0分から1970年1月1日までの経過秒数を引く。これでUNIX時間になる。 $time = $time - 11644473600; #UNIX時間からローカル時間に変換 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time); $year = $year+1900; $mon++; print $year."/".$mon."/".$mday;