• ベストアンサー

サマータイムの判定について

perlでサマータイムの判定はどのように行うのでしょうか? スクリプト実行時に、米国、英国、豪州、ニュージーランドがそれぞれサマータイム時かどうかを判定したいと考えております。 どのようなスクリプトがよいでしょうか? 時間単位の正確さは求めておりません。 WEBサーバーは日本で借りていています。 参考サイト http://webexhibits.org/daylightsaving/g.html

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#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"; }

ko_ton
質問者

お礼

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

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3のオーストリアとニュージーランドですが、 終了日の年が翌年なので、間違ってますね。 $start= の後 $year++; とでもして置いて下さい。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

gmtimeやlocaltimeの夏時間はサーバに設定されているロケールに依存すると思います。 (サーバが日本にあるなら大抵はロケールも日本) 他国の夏時間かどうかを調べるにはTime::Timezoneモジュールで調べられそうです。 http://search.cpan.org/~muir/Time-modules-2003.0211/lib/Time/Timezone.pm

ko_ton
質問者

補足

回答ありがとうございます。 Timezone.pmをCPANからインストールすることができました。(ローカルのアクティブパールには、うまくインストールできませんでした。そんなレベルの人です。) ただ私には利用方法が理解できませんでした。orz 日本語のドキュメントを探したのですが、うまく見つけられませんでした。 なにかわかりやすいサイトはないでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

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

ko_ton
質問者

補足

回答ありがとうございます。 意図はあっているのですが、うまくサマータイムの値が取れないので困ってます。 $isdst = (gmtime(time))[8]; print $isdst; とか $isdst = (gmtime(time -60*60*5))[8]; print $isdst; というようにしても、$isdstは必ず「0」を返してくるのです。 なにかやり方が悪いんでしょうか?

関連するQ&A