DateTimeの使用例
投稿:2018-08-04
きっかけはブログ主のツイートです。
WindowsでDateTimeでtime_zoneにlocalを指定するにはDateTime::TimeZone::Local::Win32のインストールが必要です。
困った事にプラグイン的に使われるモジュールだからインストールなしでコンパイル成功してしまいます。
そして実行中にDateTimeのコンストラクタで失敗して出てくるメッセージでは対策(モジュールのインストール)が分からないという難易度の高さです。
DateTime::TimeZone::Local::Win32 - Determine the local system's time zone on Windows - metacpan.org
DateTime::TimeZone::Local::Win32 - Determine the local system's time zone on Windows - metacpan.org
ああDateTime便利だなあ。
#!/usr/bin/env perl -w
use utf8;
use strict;
use warnings;
use open IO => ":utf8";
use Data::Dumper;
use DateTime::Format::Strptime;
use Encode::Argv;
use Encode::Locale;
binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";
binmode STDERR, ":encoding(console_out)";
$| = 1;
for (qw / 201808 201809 201802 202002 /) {
print "ケース:$_\n";
my $spred = month_spread($_);
print Dumper $spred;
}
exit;
sub month_spread {
my ($ym) = @_;
my $i_dt = DateTime::Format::Strptime->new(
pattern => "%Y%m",
time_zone => "local", # Windows下はDateTime::TimeZone::Local::Win32必要
)->parse_datetime($ym);
my $next_month_dt = $i_dt->clone->add(months => 1);
my @result;
for (; $i_dt->compare($next_month_dt) < 0; $i_dt->add(days => 1)) {
push @result, $i_dt->strftime("%Y%m%d");
}
return \@result;
}
WindowsとCentOSで確認しました。
ケース:201808
$VAR1 = [
'20180801',
'20180802',
'20180803',
'20180804',
'20180805',
'20180806',
'20180807',
'20180808',
'20180809',
'20180810',
'20180811',
'20180812',
'20180813',
'20180814',
'20180815',
'20180816',
'20180817',
'20180818',
'20180819',
'20180820',
'20180821',
'20180822',
'20180823',
'20180824',
'20180825',
'20180826',
'20180827',
'20180828',
'20180829',
'20180830',
'20180831'
];
ケース:201809
$VAR1 = [
'20180901',
'20180902',
'20180903',
'20180904',
'20180905',
'20180906',
'20180907',
'20180908',
'20180909',
'20180910',
'20180911',
'20180912',
'20180913',
'20180914',
'20180915',
'20180916',
'20180917',
'20180918',
'20180919',
'20180920',
'20180921',
'20180922',
'20180923',
'20180924',
'20180925',
'20180926',
'20180927',
'20180928',
'20180929',
'20180930'
];
ケース:201802
$VAR1 = [
'20180201',
'20180202',
'20180203',
'20180204',
'20180205',
'20180206',
'20180207',
'20180208',
'20180209',
'20180210',
'20180211',
'20180212',
'20180213',
'20180214',
'20180215',
'20180216',
'20180217',
'20180218',
'20180219',
'20180220',
'20180221',
'20180222',
'20180223',
'20180224',
'20180225',
'20180226',
'20180227',
'20180228'
];
ケース:202002
$VAR1 = [
'20200201',
'20200202',
'20200203',
'20200204',
'20200205',
'20200206',
'20200207',
'20200208',
'20200209',
'20200210',
'20200211',
'20200212',
'20200213',
'20200214',
'20200215',
'20200216',
'20200217',
'20200218',
'20200219',
'20200220',
'20200221',
'20200222',
'20200223',
'20200224',
'20200225',
'20200226',
'20200227',
'20200228',
'20200229'
];
