1. ホーム
  2. スクリプト・コラム
  3. パール

PerlでローカルタイムからUNIXタイムスタンプに変換する方法

2022-01-03 18:40:58

Perlスクリプトで時間情報を解決する必要がある場合、日付と時間を表現して処理する方法は2つあります。1つは読みやすい時間表現(例:"Sat Mar 14 10:14:05 EDT 2015")で、もう1つはUNIXタイムスタンプ("新時代"ともいう)を使用し、1970年1月1日から経過した秒数として表現する方法です。それぞれの方法には利点と欠点があり、また、ニーズによっては、あるフォーマットから別のフォーマットへの変換が必要になる場合もあります。
PerlでローカルタイムとUNIXタイムスタンプを変換する

日付文字列からUNIX時間を取得するには、Date::Parseモジュールのstr2time()関数を使用します。この関数は、次のようなさまざまな形式を扱うことができます。

  Sat Mar 14 10:14:05 EDT 2015
  3/14/2015 10:14:05 -0400
  14/Mar/15 10:14:05
  14 Mar 15 10:14:05

  use Date::Parse;
  my $local_time = "Sat Mar 14 10:14:05 EDT 2015";
  # 1426342445 will be stored in $unix_time
  my $unix_time = str2time($local_time);



Date:Parseモジュールは、複数の言語(英語、フランス語、ドイツ語、イタリア語)およびタイムゾーンをサポートしています。例えば

  use Date::Parse;
  use Date::Language;
  my $lang = Date::Language->new('French');
  my $unix_time = $lang->str2time("12:14:05, Ago 16, 2014 (CEST)");



UNIXタイムスタンプをPerlで読みやすい日時に変換する

UNIXタイムスタンプを読みやすい形式に変換したい場合、UNIXタイムスタンプを9要素のリストに変換するlocaltime()関数を使用することができます。この関数はUNIXタイムスタンプを9つの要素からなるリストに変換し、返されたリストを使って必要な可読形式を作成します。以下はそのコードである。

  # $sec, $min, $hour: seconds, minutes, hours
  # $mday: day of the month (0-31)
  # $mon: month, range 0 (January) to 11 (December)
  # $year: year, the difference from 1900 (2015 is 2015-1900=115)
  # $wday: day of the week, from 0 (Sunday) to 6 (Saturday)
  # $yday: day of the year, in the range 0 to 364 (or 365 for leap years)
  # $isdst: whether it is daylight saving time
  my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($unix_timestamp);
  # necessary conversion of $mon and $year
  $mon += 1;
  $year += 1900;
  print "Current time: $year-$mon - $mday $hour:$min:$sec\n";