日付変換の質問です。ある日時をページを回覧したユーザーのローカルタイムにあわせて変換して表示したい場合の方法を教えてください。本体ページはPHP4です。


具体例)
・基準日 : Fri, 09 Jun 2006 18:00:00 +0100 (RFC 822:標準時ではありません +0100に注意)
・表示する日時 : 基準日をユーザーのローカル時間に変換して表示(日本の場合 [Sat, 10 Jun 2006 01:00:00]を表示させたい)

PHP4単体でもJavaScriptとの組み合わせでもかまいません。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/06/04 21:02:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kurukuru-neko No.1

回答回数1844ベストアンサー獲得回数155

ポイント50pt

サーバ上では何か決まった時刻形式で保存する

必要があります。 

日本ご基準にして日本のJSTで保存するか、UTC

(GMT)で保存するのが一般的と思います。

ブラウザが動作しているPCのJavaScript

は、当然現地のローカル時間で標示したいので

あればUTC(GMT)で保存する事をお勧めします。

サマータイムはたまに変更されてしまい、

サーバで面倒をみるとそれをフォローする必要が

あります。

おまけにもうひとつの問題として、

まともなサマータイムに関しての資料が

少ないことです。

さらに言うとその人が利用するPCの

サマータイムを無効にしている場合なども

あるので(よく移動する人)その人にとって

ベストが何かはサーバで判断するのは困難です。

基本的に、PCの時刻はPCでしかわからないと

思った方がよいです。

又標示する場合、サマータイム(夏時間、冬時間)切替

日に限り、前後がわかるような表示をしてあげると

親切です。 なぜなら時間が戻る場合が(夏→冬)

場合があるからです。

 

方法:

 サーバPHP4で扱う時刻は、UTC/GMTのいずれか

rfc3339形式 PHP資料参照

   gmdateを使う

 クライアントの時刻は、JavaScriptで変換して

 標示してあげる。

   Date()オブジェクトで変換

JavaScript資料

 http://www.scollabo.com/banban/java/ref_15.html

http://www.asagaotv.ne.jp/~kawasaki/js/jscriptd.html

PHP資料

http://www.interq.or.jp/student/exeal/dss/ref/jscript/object/dat...

http://www.pahoo.org/e-soul/webtech/php02/php02-08-01.shtm

 http://f32.aaa.livedoor.jp/~azusa/index.php?p=14&t=php

http://nyx.pu1.net/practice/date_p/date_p3.php

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/time.2.html

id:mestallajp

rfc3339形式 PHP資料参照 助かります

サマータイムの扱いが問題ですね

ありがとうございました

2006/06/03 23:42:49

その他の回答1件)

id:kurukuru-neko No.1

回答回数1844ベストアンサー獲得回数155ここでベストアンサー

ポイント50pt

サーバ上では何か決まった時刻形式で保存する

必要があります。 

日本ご基準にして日本のJSTで保存するか、UTC

(GMT)で保存するのが一般的と思います。

ブラウザが動作しているPCのJavaScript

は、当然現地のローカル時間で標示したいので

あればUTC(GMT)で保存する事をお勧めします。

サマータイムはたまに変更されてしまい、

サーバで面倒をみるとそれをフォローする必要が

あります。

おまけにもうひとつの問題として、

まともなサマータイムに関しての資料が

少ないことです。

さらに言うとその人が利用するPCの

サマータイムを無効にしている場合なども

あるので(よく移動する人)その人にとって

ベストが何かはサーバで判断するのは困難です。

基本的に、PCの時刻はPCでしかわからないと

思った方がよいです。

又標示する場合、サマータイム(夏時間、冬時間)切替

日に限り、前後がわかるような表示をしてあげると

親切です。 なぜなら時間が戻る場合が(夏→冬)

場合があるからです。

 

方法:

 サーバPHP4で扱う時刻は、UTC/GMTのいずれか

rfc3339形式 PHP資料参照

   gmdateを使う

 クライアントの時刻は、JavaScriptで変換して

 標示してあげる。

   Date()オブジェクトで変換

JavaScript資料

 http://www.scollabo.com/banban/java/ref_15.html

http://www.asagaotv.ne.jp/~kawasaki/js/jscriptd.html

PHP資料

http://www.interq.or.jp/student/exeal/dss/ref/jscript/object/dat...

http://www.pahoo.org/e-soul/webtech/php02/php02-08-01.shtm

 http://f32.aaa.livedoor.jp/~azusa/index.php?p=14&t=php

http://nyx.pu1.net/practice/date_p/date_p3.php

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/time.2.html

id:mestallajp

rfc3339形式 PHP資料参照 助かります

サマータイムの扱いが問題ですね

ありがとうございました

2006/06/03 23:42:49
id:kazu1107 No.2

回答回数199ベストアンサー獲得回数14

ポイント35pt

一度UNIXタイムに変換してから時差計算(足し引き)すれば良いのではないでしょうか?

ただ、+100の意味は+1時間でしたっけ?いまいちわからないのでそこはご了承ください;;


いろいろな場所の時間を計算するとプラスマイナスの計算が面倒なので、一度UTC時刻を求めるほうが良いかもしれません。

$base = mktime(18, 0, 0, 6, 9, 2006) + 60 * 60;

$jptime = $base - $timezone*60;


$timezoneは前回の仕様に従っていれば-540のはずです。60や-540は分数なので、60をかけて秒数にしています。

最終的に求まる$jptimeはUNIXタイムなので「date("Y-m-d",$jptime)」で書式化できると思います。

id:mestallajp

UTCで統一してみます

ありがとうございました

2006/06/03 23:44:28
  • id:mestallajp
    おかげさまでできそうです
    ユーザーのTimeZoneOffsetとDST(サマータイム設定)を取得するJSがあったので、今後の参考にあげときます

    Time Zone Offset Calculations
    http://www.csgnetwork.com/timezoneproginfo.html

    同サイトのライブラリも参考になりました
    http://www.csgnetwork.com/
  • id:bonlife
    既に終了済みですが、ちょっと気になったことがありますので、ご存知の方がいらしたら教えてください。
    基準日が「Fri, 09 Jun 2006 18:00:00 +0100」の場合、標準時では「Fri, 09 Jun 2006 17:00:00 +0000」になりますよね。
    それを日本時間に変換すると「Sat, 10 Jun 2006 02:00:00 +0900」となると思うのですが。
    (私がちょっとした勘違いをしているような気がするのですが、よく分かりませんでした。)

    参考情報ですが、UNIXタイムスタンプへの変換はstrtotime()が簡単で便利です。

    <?php
    $offset = "-540"; // JavaScriptで取得したと仮定
    $str = "Fri, 09 Jun 2006 18:00:00 +0100";
    print $str . "<br />";
    // strtotimeでUNIXタイムスタンプに変換
    // $offsetの値を秒に変換したものを引いて、gmdateで整形
    print gmdate("D, d M Y H:i:s",strtotime($str)-$offset*60) . "<br />";
    ?>
    出力は以下のようになります。
    Fri, 09 Jun 2006 18:00:00 +0100
    Sat, 10 Jun 2006 02:00:00
  • id:mestallajp
    おっしゃる通り
    Fri, 09 Jun 2006 17:00:00 +0000 は
    Sat, 10 Jun 2006 02:00:00 +0900 ですよね
    この基準日はドイツだったのですが、DST(サマータイム制)です
    日本とドイツの時差は通常+8時間ですが、夏期は+7時間になります

    「ユーザーのDSTを含めての時差変換・表示」をさせたい意図でこの質問をしました(というか調べているうちにDST差分に気づきました・・・汗)
    GMT/UTCへ変換->時差&DST情報で変換
    の流れで対応しました
  • id:bonlife
    ご返信ありがとうございます。
    質問文の日本時間部分については誰も指摘していないようでしたので、私が何か大きな勘違いをしているのかと思っておりました。
    スッキリいたしました。

    サマータイムが絡んだ時差の問題はなかなか難しいですね。
    今度勉強してみようと思います。
  • id:kurukuru-neko

    LinuxのタイムゾーンZoneファイルは
    メンテナンスが不完全だったりして、正しく
    時間が処理できない場合があります。

    誤差についても結構えげつないタイムゾーンも
    あるので、Windows/Linuxで全く同一とは常に
    限りません。 

    タイムゾーンについては、たまに各国の事情で
    いきなり変更される事があるで本当の意味での
    タイムゾーン対応は結構難しい。

    画表示も 夏・冬時間を区別出来るような
    工夫が必要です。 特に切替前後の日
    (日が戻るタイムゾーン切替がたしかあった)



この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません