用途
- 曜日限定のマスタデータを定義する場合に1レコードで管理できる
ID | Caption | Dow | |
---|---|---|---|
1 | 火曜限定 | 2 | |
2 | 土日曜限定 | 96 | |
※Dow = DayOfWeek |
ルール
0 | 1 | 2 | 4 | 8 | 16 | 32 | 64 |
---|---|---|---|---|---|---|---|
指定なし | 月曜 | 火曜 | 水曜 | 木曜 | 金曜 | 土曜 | 日曜 |
- 土曜日を定義したい場合は 32 になる
- 土曜と日曜日を定義したい場合は 96 (32+64)になる
- 月曜と水曜と金曜日を定義したい場合は 21 (1+4+16)になる
- ビット演算を利用して曜日の組み合わせを 0~127 の数値で定義することができる(但し0と127は同じ結果)
チェック処理
hoge1.pl
use strict;
use warnings;
use utf8;
use DateTime;
use constant {
MON => 1, TUES => 2, WED => 4, THUR => 8,
FRI => 16, SAT => 32, SUN => 64,
};
printf "MasterData(%d) is Saturday? %s\n", 1, !is_dayofweek(1)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n", 32, !is_dayofweek(32)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n", 34, !is_dayofweek(34)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n", 64, !is_dayofweek(64)? "no":"yes";
printf "MasterData(%d) is Saturday? %s\n", 127, !is_dayofweek(127)? "no":"yes";
# 0:対象日外、0以外:対象日
sub is_dayofweek {
my ($dow) = @_;
return 1 unless $dow; # 0の場合は全有効
return $dow & (1 << DateTime->today->day_of_week_0);
}
1;
実行結果(土曜日に実行した場合)
$ perl hoge1.pl
MasterData(1) is Saturday? no
MasterData(32) is Saturday? yes
MasterData(34) is Saturday? yes
MasterData(64) is Saturday? no
MasterData(127) is Saturday? yes
1,0 でチェックしたい場合
# 0:対象日外、1:対象日
sub is_dayofweek {
my ($dow) = @_;
return 1 unless $dow; # 0の場合は全有効
return ($dow & (1 << DateTime->today->day_of_week_0))? 1 : 0;
}
数値を曜日に変更するサンプル
hoge2.pl
use strict;
use warnings;
use utf8;
use DateTime;
use Encode;
use constant {
MON => 1, TUES => 2, WED => 4, THUR => 8,
FRI => 16, SAT => 32, SUN => 64,
};
for my $i (1..127) {
printf "%3d : %s\n", $i, dayofweek_name($i);
}
sub dayofweek_name {
my ($dow) = @_;
return '' unless $dow;
my @ret;
push @ret, '月' if ( $dow & MON );
push @ret, '火' if ( $dow & TUES );
push @ret, '水' if ( $dow & WED );
push @ret, '木' if ( $dow & THUR );
push @ret, '金' if ( $dow & FRI );
push @ret, '土' if ( $dow & SAT );
push @ret, '日' if ( $dow & SUN );
return encode('utf-8',(join ',', @ret));
}
1;
実行結果
$ perl hoge2.pl
1 : 月
2 : 火
3 : 月,火
4 : 水
5 : 月,水
...
124 : 水,木,金,土,日
125 : 月,水,木,金,土,日
126 : 火,水,木,金,土,日
127 : 月,火,水,木,金,土,日