Perlの小部屋
Perlのプログラミングや利用方法を基本的を中心に情報提供しています

日付を扱う処理

perlで日付の比較を行うにはDateTimeモジュールやDate::Calcモジュールを使用すると便利です。
また、Perlの5.10からTime::Pieceと呼ばれる時刻を便利に扱うためのモジュールが標準モジュールに加わりました。

時刻・日付の情報の取得

標準関数のlocaltimeで時刻情報を取得した場合。

my ($second, $minute, $hour, $mday, $month, $year) = localtime;
# 月は0から始まるので1を加算
$month += 1;

# 年は1900を引いた値で取得されるので1900を加算
$year  += 1900;

日付の比較や情報の取得 DateTime・Date::Calcモジュール編

DateTimeモジュールを使用した場合。

#■ DateTimeモジュール ■
use DateTime;
my $dt1 = DateTime->new(year => 2019, month => 3, day => 1);
my $dt2 = DateTime->today;#本日
my $dur = $dt1->delta_days($dt2);
my $progress_days =$dur->in_units('days');

print "2019/3/1から $progress_days経過しました。";

Date::Caclモジュールを使用した場合。

#■ Date::Caclモジュール ■
use Date::Calc qw(:all);

#今日の日付を取得
my ($nowyear, $nowmonth, $nowday) = Today();(形式:2019-6-12)
print "$nowyear年 $nowmonth月 $nowday日";

#現在のタイムスタンプを取得(形式:2019-6-12-10-29-10)
my ($year, $month, $day, $hour, $min, $sec) = Today_and_Now();
print "$year年 $month月 $day日 $hour時 $min分 $sec秒";

#現在の曜日を数字にて取得
my $day_of_week = Day_of_Week($year,$month,$day);
print "$day_of_week"; # 1:月 2:火 3:水 4:木 5:金 6:土 7:日

#現在の曜日をテキストにて取得
my $day_of_week_to_text = Day_of_Week_to_Text($day_of_week);
print "$week_to_text"; # Monday-Sunday

#今日の曜日をテキスト(省略形)にて取得
my $week_abbreviation = Day_of_Week_Abbreviation($day_of_week);
print "$week_abbreviation"; # Mon-Sun

#昨日の日付を取得
my ($y_year, $y_month, $y_day) 
  = Add_Delta_Days($year, $month, $day, -1);
print "昨日は$y_year年 $y_month月 $y_day日";

#一年三ヶ月後の日時を取得
my ($n_year, $n_month, $n_day) 
  = Add_Delta_YM($year, $month, $day,+1,+3);
print "一年三ヶ月後は$n_year年 $n_month月 $n_day日";

#指定月の日数を取得(月末日の取得)
my $days = Days_in_Month($year,$month);
print "今月の日数は$days";

my $select_year=2029;
my $select_mon=1;
my $select_mday=1;
#今日の日付と特定の日付を比較
if(Date_to_Days($year,$month,$day) 
   <= Date_to_Days($select_year,$select_mon,$select_mday))
{
print "今日の日付よりも特定の日付が後にある時の処理";
}

日付の比較や情報の取得 Time::Pieceモジュール編

Time::PieceはDateTimeモジュールと比較してCPANからインストールの必要もなく高速・軽量なモジュールです。※Perlの5.10以上に標準でインストールされています。

時刻・日付の情報の取得

localtimeを呼び出しTime::Pieceオブジェクトを取得

use Time::Piece;

# Time::Pieceオブジェクトの取得
my $today = localtime;

# 日付や時刻の情報の取得
my $year   = $today->year;
my $month  = $today->mon;
my $day   = $today->mday;

my $hour   = $today->hour;
my $min = $today->minute;
my $sec = $today->sec;

print "現在 $year年 $month月 $day日 $hour時 $min分 $sec秒";
Time::Piece利用関数
$today->year
$today->_year年 - 1900 (標準関数のlocaltimeと同じ)
$today->yy年の下2桁
$today->mon月(1から始まる)
$today->_mon月(0から始まる 標準関数のlocaltimeと同じ)
$today->monname
$today->month
月名の省略形(Jan~)
$today->fullmonth月名(January~)
$today->mday
$today->day_of_month
$today->hour24 hour
$today->min
$today->minute
$today->sec
$today->second
$today->wday曜日を数字にて取得(1が日曜日~)
$today->_wday
$today->day_of_week
曜日を数字にて取得(0が日曜日~)
$today->wdayname
$today->day
週名の省略形(Sun~)
$today->fullday週名(Sunday~)
$today->yday
$today->day_of_year
年の中で何日目か
$today->isdst
$today->daylight_savings
夏時間かどうか
$today->epochエポックからの秒数

日付の判定

うるう年かどうかの判定と月末日かどうかの判定

# うるう年かどうか
use Time::Piece;
my $today = localtime;
my $leap_year=$today ->is_leap_year;
print "$leap_year << 1なら閏年";

# 月末日の取得(28-31の数値を返す)
my $last_day_of_month=$today ->month_last_day
print "今月末日は$last_day_of_month日";

日付・時刻を書式化

デフォルトで用意されているフォーマット

Time::Piece 日付・時刻 フォーマット
$today->hms
$today->hms(".")
$today->time
12.00.00
$today->ymd
$today->date
2019-09-20
$today->mdy09-20-2019
$today->mdy("/")09/20/2019
$today->dmy20-09-2019
$today->dmy(".")20.09.2019
$today->datetime2019-09-20T12:00:00
$today->cdate
"$today"
Fri Sep 20 12:00:00 2019

$today->ymd フォーマット

# $today->ymd
use Time::Piece;
my $today = localtime;
my $ymd=$today->ymd;
print "$ymd << yyyy-mm-ddフォーマット";

フォーマットのカスタマイズ

strftimeメソッドを利用しフォーマットを自由にカスタマイズできます。

strftimeメソッド フォーマットのカスタマイズ
%a曜日の省略名
%A曜日名
%b月の省略名
%B
%h
月名
%cデフォルトのフォーマット
%C年の最初の2桁
%d日( 01 から 31 )
%D%m/%d/%y と同じ。月日年
%e日( 1 から 31 )
%F%Y-%m-%d と同じ( 2019-9-20 )
%g年の下2桁 ( 00 ~ 99 )
%H時( 00 から 23 )
%I時( 01 から 12 ) 12時間表記での時刻
%j年初から何日目か。( 001 から 366 )
%k時( 0 から 23 )
1桁の数字( 0~ 9 )の2桁目はスペースになる。
%l時( 1 から 12 ) 12時間表記での時刻
1桁の数字( 0~ 9 )の2桁目はスペースになる。
%m月の番号( 01 から 12 )
%M分( 00 から 59 )
%n改行文字
%Nミリ秒( %3N でミリ秒を3桁で、 %6Nで6桁表示 )
%pam か pm
%PAM か PM
%r%I:%M:%S %p と同じ。( 10:20:30 PM )
%R時分( 10:20 )
%sエポックからの秒数
%S秒( 00 から 61 )
%tタブ文字
%T%H:%M:%S と同じ。時分秒( 20:10:05 )
%u曜日の番号( 1 から 7。 月曜日が1 )
%U年の最初から数えて何週目か。( 00 から 53 )
年初の日曜日を週の最初として数える。
最初の日曜日の週が01。その前の週が00。
%V年の最初から数えて何週目か。( 01 から 53 )
最低4日を持つ週を年の最初の週とする。月曜日を週の最初として数える。
%w曜日の番号( 0 から 6。 日曜日が0 )
%W年の最初から数えて何週目か( 00 から 53 )
年初の月曜日を週の最初として数える。
最初の月曜日の週が01。その前の週が00。
%x日付のデフォルトのフォーマット
%X時刻のデフォルトのフォーマット
%y年の下の2桁
%Y
%G
%zUTC(協定世界時)からのタイムゾーンの時刻のずれ)
%Zタイムゾーン名
%%%

strftimeメソッドでフォーマットのカスタマイズ

# strftime
use Time::Piece;
my $format;
my $today = localtime;
$format='%Y-%m-%d %H:%M:%S';
my $format_day=$today->strftime($format);

print "$format_day << yyyy-mm-dd HH:MM:SS ";
print "フォーマット(例2019-09-20 12:30:30)";

日付・時刻の計算

Time::Pieceでは日付や時刻の計算を行うこともできます。Time::Pieceオブジェクトどうしの引き算を行った場合は、戻り値はTime::Secondsオブジェクトになります。文字列として評価した場合は秒数になります。

引き算

# Time::Seconds
use Time::Piece;
my $today = localtime;
my $datetime = '2022-9-11';
my $after_day = Time::Piece->strptime($datetime, '%Y-%m-%d');

my $sec = $after_day - $today;
my $after_month = $sec->months;

print "(2022-9-11) - $todayは $after_month ケ月";

#Time::Secondsに用意された定数
#$sec->seconds;
#$sec->minutes;
#$sec->hours;
#$sec->days;
#$sec->weeks;
#$sec->months;

足し算

# Time::Seconds
use Time::Piece;
use Time::Seconds;
my $today = localtime;
my $day_plus = $today + ONE_DAY * 5;

print "$todayの5日後は $day_plus";

#Time::Secondsに用意された定数
#ONE_DAY
#ONE_WEEK
#ONE_HOUR
#ONE_MINUTE
#ONE_MONTH
#ONE_YEAR
#ONE_FINANCIAL_MONTH
#LEAP_YEAR
#NON_LEAP_YEAR
#定数を利用するにはTime::Secondsモジュールを利用します

日付の比較

日付の比較には比較演算子が利用できます。("<", ">","<=", ">=", "<=>", "==" and "!=")

use Time::Piece;

my $today = localtime;
my $datetime = '2022-9-11'; #特定の日付
my $compare_day = Time::Piece->strptime($datetime,'%Y-%m-%d');

#今日の日付と特定の日付を比較
if($today < $compare_day){
print "今日の日付よりも特定の日付が後にある時の処理\n";
}else{
print "今日の日付よりも特定の日付が前にある時の処理\n";
}
ページトップ