package lib;
#----------------------------------------------------------#
# 姫君スクリプト ライブラリ Version 0.1 #
#----------------------------------------------------------#
# ----------------------------------------------------------
# Windows対応flock
# 引き数:ロックファイル名
# 戻り値:1=ロックファイルが存在する
# 0=ロックファイルが存在しない
sub FlockOn
{
local($lockfile) = @_;
if(-f "$lockfile"){
return 1;
}else{
if(open(LOCK,">$lockfile")){
print LOCK "lock";
close(LOCK);
chmod 0777, "$lockfile";
return 0;
}else{
return 0;
}
}
}
# ----------------------------------------------------------
# Windows対応unflock
# 引き数:ロックファイル名
# 戻り値:なし
sub FlockOff
{
local($lockfile) = @_;
unlink("$lockfile");
}
# ----------------------------------------------------------
# 2000年問題に対応した日付けを求める
# 引き数:gettimeやtimeの戻り値
# 戻り値:年、月、日、曜日、時間、分、秒
sub getdatetime
{
local($time,$jisa) = @_;
local($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst);
if($time eq ""){$time = time;}
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($time + $jisa*60*60);
$year = $year+1900;
$mon = $mon+1;
return($year,$mon,$day,$wday,$hour,$min,$sec);
}
# ----------------------------------------------------------
# 月末の数字を求める
# 引き数:年、月
# 戻り値:月末の数字
sub getgetumatu
{
local($year,$mon) = @_;
@monthday = ('31','28','31','30','31','30','31','31','30','31','30','31');
if($mon != 2){
return(@monthday[$mon-1]);
}else{
if(&leapyear($year)){
return(29);
}else{
return(28);
}
}
}
# ----------------------------------------------------------
# 曜日を求める
# 引き数:年、月、日
# 戻り値:曜日の数字
# 0="日",1="月",2="火",3="水",4="木",5="金",6="土"
sub getyoubi
{
local($year,$mon,$day) = @_;
local($time,$sec,$min,$hour,$wday,$yday,$isdst);
$time = &gettime($year,$mon,$day);
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = gmtime($time);
return($wday);
}
# ----------------------------------------------------------
# localtimeやgmtimeの引き数にできる数字を求める
# 引き数:年、月、日
# 戻り値:localtimeやgmtimeの引き数にできる数字
sub gettime
{
local($year,$mon,$day) = @_;
local($daynum,$time,$i);
@monthday = ('31','28','31','30','31','30','31','31','30','31','30','31');
$daynum = 0;
$mon = $mon - 1;
$daynum += ($year-1)*365+int(($year-1)/4)-int(($year-1)/100)+int(($year-1)/400);
for($i = 0; $i < $mon; $i++){
$daynum += $monthday[$i];
if($i == 1 && &leapyear($year)){
$daynum++;
}
}
$daynum += $day;
$time = ($daynum - 719163) * 24 * 60 * 60;
return ($time);
}
# ----------------------------------------------------------
# 閏年の判定
# 引き数:年
# 戻り値:1=閏年、0=閏年じゃない
sub leapyear
{
local($year) = @_;
if(($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0){
return 1;
}else{
return 0;
}
}
# ----------------------------------------------------------
# 未来の日付算出
# 引き数:年月日(YYYYMMDD)、日数
# 戻り値:年月日(YYYYMMDD)
# ※一週間以内の日付までしか対応していません(2ヶ月又借りは、NG)
sub FutureDay
{
local($ymd,$n) = @_;
local($year,$mon,$day,$w_day);
$year = substr($ymd,0,4);
$mon = substr($ymd,4,2);
$day = substr($ymd,6,2);
if ($n != 0) {
$w_day = &getgetumatu($year,$mon);
if (($day+$n) <= $w_day) {
$day = $day + $n;
} else {
if ($mon >= 12){
$year++;
$mon = 1;
}else{
$mon++;
}
$day = ($day + $n) - $w_day;
}
$wyear = sprintf("%04d", $year) . sprintf("%02d", $mon) . sprintf("%02d", $day);
} else {
$wyear = $ymd;
}
$wyobi = &getyoubi($year,$mon,$day);
return ($wyear,$wyobi);
}
# ----------------------------------------------------------
# 経過日数の算出
# 引き数:基点年月日(YYYYMMDD)
# 戻り値:経過日数(基点年月日から今日までの経過日数)
sub Kdays
{
use Time::Local;
local($day) = @_;
local($time,$time1,$w_year,$w_mon,$w_day,$kdays);
$w_year = substr($day,0,4); $w_mon = substr($day,4,2); $w_day = substr($day,6,2);
$time = timelocal(0, 0, 0, $w_day, $w_mon - 1, $w_year);
$time1 = time;
$kdays = int(abs(($time1 - $time) / 60 / 60 / 24));
return ($kdays);
}
# ----------------------------------------------------------
# エラーメッセージ処理
sub error
{
local($ermsg,$erkbn) = @_;
if ($erkbn eq "end"){
&header;
print "
ERROR !
\n";
print "$ermsg\n";
print "
\n";
print "";
&footer;
exit 1;
}elsif($erkbn eq "back"){
print "
ERROR !
\n";
print "$ermsg\n";
print "
\n";
print "";
}elsif($erkbn eq "jmp"){
print "\n";
print "";
print "\n";
}elsif($erkbn eq "clr"){
print "
ERROR !
\n";
print "$ermsg\n";
print "
\n";
print "";
}else{
print "
ERROR !
\n";
print "$ermsg\n";
print "
\n";
}
}
# ----------------------------------------------------------
# 祝日のデータ格納処理(年単位)
# 引き数:年
# 戻り値:祝日データ
sub DayModify
{
local($year) = @_;
local($i,$j,$k,$Holiday);
local($shun,$yearly_year,$yearly_mon,$yearly_day,$yearly_dat);
local($event_flag,$yearly_flag,$j,$weekday,$yearly_day_tmp);
local(@yearly_tmp,@event_sort);
local($w_youbi,$weekcnt,$cntstart_day,$cntstart_youbi,$tmpcnt);
local(@Holiday) = ();
local(@eventlist) = ();
#a1 :月 日 内容 平日=0/休日=1
#a2/a3:月 週数 曜日 内容 平日=0/休日=1
push(@Holiday,"a1\t1\t1\t元旦\t1");
push(@Holiday,"a1\t1\t15\t成人の日\t1");
push(@Holiday,"a1\t2\t11\t建国記念の日\t1");
push(@Holiday,"a1\t4\t29\tみどりの日\t1");
push(@Holiday,"a1\t5\t3\t憲法記念日\t1");
push(@Holiday,"a1\t5\t4\t国民の休日\t1");
push(@Holiday,"a1\t5\t5\tこどもの日\t1");
push(@Holiday,"a1\t7\t20\t海の日\t1");
push(@Holiday,"a1\t9\t15\t敬老の日\t1");
push(@Holiday,"a1\t10\t10\t体育の日\t1");
push(@Holiday,"a1\t11\t23\t勤労感謝の日\t1");
push(@Holiday,"a1\t11\t3\t文化の日\t1");
push(@Holiday,"a1\t12\t23\t天皇誕生日\t1");
push(@Holiday,"a1\t12\t24\tクリスマスイブ\t0");
push(@Holiday,"a1\t12\t25\tクリスマス\t0");
push(@Holiday,"a1\t12\t31\t大晦日\t0");
push(@Holiday,"a2\t1\t2\t1\t成人の日\t1");
push(@Holiday,"a2\t10\t2\t1\t体育の日\t1");
push(@Holiday,"a3\t7\t3\t1\t海の日\t1");
push(@Holiday,"a3\t9\t3\t1\t敬老の日\t1");
if($year < 2000){
foreach (@Holiday) {
# a1のみ抽出
if($_ =~ /^a1/){
push(@eventlist, "$_\t$year\n");
}
}
} else {
if ($year < 2003) {
foreach (@Holiday) {
# a2|a3|体育の日|成人の日以外を抽出(後でa2を追加)
if(!/^a2|a3|体育の日|成人の日/){
push(@eventlist, "$_\t$year\n");
}
}
} else {
foreach (@Holiday) {
# a2|a3|体育の日|成人の日|海の日|敬老の日以外を抽出(後でa2とa3を追加)
if(!/^a2|a3|体育の日|成人の日|海の日|敬老の日/){
push(@eventlist, "$_\t$year\n");
}
}
}
}
# 春分の日の割出し(1980年以降に適用)
$shun = int(20.8431+0.242194*($year-1980)-int(($year-1980)/4));
push(@eventlist,"a1\t3\t$shun\t春分の日\t1\t$year\n");
# 秋分の日の割出し(1980年以降に適用)
$shuu = int(23.2488+0.242194*($year-1980)-int(($year-1980)/4));
push(@eventlist,"a1\t9\t$shuu\t秋分の日\t1\t$year\n");
# 振替休日のチェック
for($j = 0; $j <= $#eventlist; $j++){
($event_flag,$yearly_mon,$yearly_day,$yearly_dat,$yearly_flag,$yearly_year) =
split(/\t/,@eventlist[$j]);
if ($event_flag eq "a1"){
$weekday = &getyoubi($year,$yearly_mon,$yearly_day);
if ($weekday == 0 && $yearly_flag == 1 && $yearly_dat ne "憲法記念日" && $yearly_dat ne "国民の休日"){
$yearly_day_tmp = $yearly_day + 1;
push(@eventlist,"$event_flag\t$yearly_mon\t$yearly_day_tmp\t振替休日\t1\t$year\n");
}
}
}
# 改正祝日法に対応
if($year >= 2000) {
@yearly_tmp = ();
foreach (@Holiday) { if($_ =~ /^a2/){ push(@yearly_tmp, "$_\t$year\n"); }}
if($year >= 2003) { foreach (@Holiday) { if($_ =~ /^a3/){push(@yearly_tmp, "$_\t$year\n");} }}
for($i = 0; $i <= $#yearly_tmp; $i++){
($event_flag,$yearly_mon,$weekcnt,$w_youbi,$yearly_dat,$yearly_flag,$yearly_year) =
split(/\t/,@yearly_tmp[$i]);
if($weekcnt == 1){$cntstart_day = 1;}
elsif($weekcnt == 2){$cntstart_day = 8;}
elsif($weekcnt == 3){$cntstart_day = 15;}
elsif($weekcnt == 4){$cntstart_day = 22;}
elsif($weekcnt == 5){$cntstart_day = 29;}
$cntstart_youbi = &getyoubi($year,$yearly_mon,$cntstart_day);
$tmpcnt = $w_youbi - $cntstart_youbi;
if($tmpcnt < 0){
$yearly_day_tmp = $cntstart_day + (7 + $tmpcnt);
} else {
$yearly_day_tmp = $cntstart_day + $tmpcnt;
}
push(@eventlist,"$event_flag\t$yearly_mon\t$yearly_day_tmp\t$yearly_dat\t$yearly_flag\t$year\n");
}
}
@event_sort = sort @eventlist;
return(@event_sort);
}
# ----------------------------------------------------------
# 祝日/振替休日等の取得
# 引き数:年、月、日、祝日データ
# 戻り値:祝日フラグ(0=平日 1=祝日/振替休日等)
sub MakeEvent
{
local($eyear,$emon,$eday,@eventlist) = @_;
local($i,$flag);
$flag = 0;
for($i = 0; $i <= $#eventlist; $i++){
($e_i,$e_mon,$e_day,$e_e,$e_flag,$e_year) = split(/\t/,@eventlist[$i]);
if($eyear == $e_year && $emon == $e_mon && $eday == $e_day){
$flag = $e_flag; last;
}
}
return($flag);
}
1;