1. ホーム
  2. perl

[解決済み] Perlで日付/時刻をエポックタイム(1970年からのunix時間/秒)に変換するには?

2022-02-14 12:46:35

質問内容

日付/時刻が(年、月、日、時、分、秒)の配列である場合、エポック時間、すなわち1970-01-01 00:00:00 GMTからの秒数にはどのように変換しますか。

ボーナス質問です。日付/時刻が文字列として与えられた場合、まずどのようにそれをパースして (y,m,d,h,m,s) 配列に入れますか?

どのように解決するのですか?

これは、unixの時間を取得する最も簡単な方法です。

use Time::Local;
timelocal($second,$minute,$hour,$day,$month-1,$year);

引数の順序が逆であることと、1月が0ヶ月目であることに注意してください。 その他の多くのオプションについては 日付時間 モジュールがあります。

パースに関しては 日付::パース モジュールです。 もし本当に日付の解析に凝る必要があるのなら 日付::操作 しかし、このドキュメントでは、多くの荷物(例えば、一般的な営業日のようなものを知っている)があり、他のソリューションの方がはるかに速いので、避けるようにと警告しています。

もし、解析する日付/時刻のフォーマットについて何か知っているのであれば、単純な正規表現で十分かもしれませんが、おそらく適切なCPANモジュールを使用する方が良いでしょう。 例えば、日付が常にYMDHMS順であることが分かっている場合、CPANモジュールの 日付時刻::形式::ISO8601 .


参考までに、日付が常にYMDHMS順で、quot;HMS"の部分はオプションであることが分かっているアプリケーションで使用している関数を以下に示します。 この関数では、任意のデリミタ(例えば、"2009-02-15" や "2009.02.15" )が使用できます。 対応するunix時間(1970-01-01 00:00:00 GMTからの秒数)を返し、解析できなかった場合は-1します(つまり、日付 1969-12-31 23:59:59 を合法的に解析する必要がないことを確認したほうがよいでしょう)。 また、2桁の年号XXから"69"までは"20XX"、それ以外は"19XX"と推定します(例えば"50-02-15"は2050-02-15ですが"75-02-15"は1975-02-15を意味します)。

use Time::Local;

sub parsedate { 
  my($s) = @_;
  my($year, $month, $day, $hour, $minute, $second);

  if($s =~ m{^\s*(\d{1,4})\W*0*(\d{1,2})\W*0*(\d{1,2})\W*0*
                 (\d{0,2})\W*0*(\d{0,2})\W*0*(\d{0,2})}x) {
    $year = $1;  $month = $2;   $day = $3;
    $hour = $4;  $minute = $5;  $second = $6;
    $hour |= 0;  $minute |= 0;  $second |= 0;  # defaults.
    $year = ($year<100 ? ($year<70 ? 2000+$year : 1900+$year) : $year);
    return timelocal($second,$minute,$hour,$day,$month-1,$year);  
  }
  return -1;
}