プロが教える店舗&オフィスのセキュリティ対策術

perlでサマータイムの判定はどのように行うのでしょうか?

スクリプト実行時に、米国、英国、豪州、ニュージーランドがそれぞれサマータイム時かどうかを判定したいと考えております。

どのようなスクリプトがよいでしょうか?

時間単位の正確さは求めておりません。
WEBサーバーは日本で借りていています。

参考サイト
http://webexhibits.org/daylightsaving/g.html

A 回答 (4件)

#1>サマータイムの値が取れない


その後追試してみましたが、
#2で仰るように、gmtime, localtime は、マシンに設定されている状況に依存するようです。(日本では夏時間が設定されていないので、常に0)
標準時で取れるもんだと思い込んでいました、すみません。

モジュールを探してみましたが適当なモノが見つかりませんでしたけれども、
質問者の参考サイトにサマータイムの期間の一覧があるので、それを使ってゴリゴリとやればいいですね。
そこで
CPANモジュールの Date::Manip を使って書いてみました。
----------------------------------------------------------------
#http://webexhibits.org/daylightsaving/g.html
use Date::Manip;
Date_Init("TZ=JST");

$today = ParseDate("today");
print UnixDate($today,"%Y/%m/%d %H:%M:%S %Z\n");#現在日本時間

$USA = Date_ConvTZ($today,"JST","CST");#Central Standard:アメリカ中部標準時間
print UnixDate($USA,"%Y/%m/%d %H:%M:%S at USA\n");
$year = UnixDate($USA,"%Y");
#※2007年以降3月の2番目の日曜日に始まって、11月の最初の日曜日に終わる、と改正
$start = ParseDate("2:00am 1st sunday in April $year");
$end = ParseDate("2:00am last sunday in October $year");
if(Date_Cmp($start,$USA)<=0 && Date_Cmp($USA,$end)<0){
print "USA is Daylight Saving Time!\n";
}
$ENG = Date_ConvTZ($today,"JST","WET");#Western European:西ヨーロッパ時間
print UnixDate($ENG,"%Y/%m/%d %H:%M:%S at UK\n");
$year = UnixDate($ENG,"%Y");
$start = ParseDate("1:00am last sunday in March $year");
$end = ParseDate("1:00am last sunday in October $year");
if(Date_Cmp($start,$ENG)<=0 && Date_Cmp($ENG,$end)<0){
print "UK is Daylight Saving Time!\n";
}

$AUS = Date_ConvTZ($today,"JST","CAST");#Central Australian Standard:オーストラリア中部標準時間
print UnixDate($AUS,"%Y/%m/%d %H:%M:%S at AUS\n");
$year = UnixDate($AUS,"%Y");
$start = ParseDate("last sunday in October $year");
$end = ParseDate("last sunday in March $year");
if(Date_Cmp($start,$AUS)<=0 && Date_Cmp($AUS,$end)<0){
print "Australia is Daylight Saving Time!\n";
}
$NZ = Date_ConvTZ($today,"JST","NZST");#New Zealand Standard
print UnixDate($NZ,"%Y/%m/%d %H:%M:%S at NZ\n");
$year = UnixDate($NZ,"%Y");
$start = ParseDate("1st sunday in October $year");
$end = ParseDate("3rd sunday in March $year");
if(Date_Cmp($start,$NZ)<=0 && Date_Cmp($NZ,$end)<0){
print "New Zealand is Daylight Saving Time!\n";
}
    • good
    • 0
この回答へのお礼

Date::Manipはインストール済みでしたのでスームーズにうまく動作しました。
以前の第2水曜日の件に続いてホントにありがとうございました。

お礼日時:2006/08/14 02:56

#3のオーストリアとニュージーランドですが、


終了日の年が翌年なので、間違ってますね。
$start= の後
$year++;
とでもして置いて下さい。
    • good
    • 0

gmtimeやlocaltimeの夏時間はサーバに設定されているロケールに依存すると思います。


(サーバが日本にあるなら大抵はロケールも日本)
他国の夏時間かどうかを調べるにはTime::Timezoneモジュールで調べられそうです。

http://search.cpan.org/~muir/Time-modules-2003.0 …

この回答への補足

回答ありがとうございます。

Timezone.pmをCPANからインストールすることができました。(ローカルのアクティブパールには、うまくインストールできませんでした。そんなレベルの人です。)

ただ私には利用方法が理解できませんでした。orz

日本語のドキュメントを探したのですが、うまく見つけられませんでした。
なにかわかりやすいサイトはないでしょうか?

補足日時:2006/08/12 15:35
    • good
    • 0

gmtime (グリニッジ標準時)


の返値 (秒,分,時,日,月,年,曜日,年の通算日,夏時間)
で夏時間の部分が真なら夏時間
勘違いコメントだったらすみません

この回答への補足

回答ありがとうございます。
意図はあっているのですが、うまくサマータイムの値が取れないので困ってます。

$isdst = (gmtime(time))[8];
print $isdst;

とか

$isdst = (gmtime(time -60*60*5))[8];
print $isdst;

というようにしても、$isdstは必ず「0」を返してくるのです。

なにかやり方が悪いんでしょうか?

補足日時:2006/08/12 15:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!