ルモーリン

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便利だなあ。
#!/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'
        ];