2011-01-31 9 views
0

私は新しいウェブサイトを構築します。しかし、ホストはUSA.iにあります。私はアメリカではありません。 ウェブサイトのページで1つのローカル変数と比較する時間が必要です。 しかし、時差のために、それは8住宅の違いがあります。このプロブラムを解決するには?どのように国際時間を扱う?

私のコード

SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); 
java.util.Date currentTime = new java.util.Date(); 
String dateString = formatter.format(currentTime); ` 

どのようにこれらのコードを修正するには?

+1

関連:http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices – BalusC

答えて

1

タイムゾーンを処理するために、JavaにはOlson timezone databaseが含まれています。あなたと同じタイムゾーンにあるデータベース内の都市を探します。

まず、希望する時間帯にTimeZone objectを取得する必要があります。次に、現在の日付と時刻(または使用したい日付と時刻)のCalendar objectを取得します。 SimpleDateFormatオブジェクトを使用してフォーマットすることができます。

TimeZone local = TimeZone.getTimeZone("Asia/Tokyo"); 
Calendar now = Calendar.getInstance(local); // gets time in the current timezone 
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); 
formatter.setTimeZone(local) 

String dateString = formatter.format(now.getTime()); 

あなたが時間操作をたくさんやっている場合が、Bozhoが言うように、ジョダ時のために行きます。 Javaの日時システムは混乱し、むしろあまり設計されていません。

+0

私はjspページにuコードを入れました...しかし、それはうまくいきません。私の現地時間と同じ時間です.. "アジア/東京"時間ではない..なぜ? – alex

+0

@alex私はフォーマッタにタイムゾーンを設定するのを怠ったからです。私はそれを修正しました。私が言ったように、それは混乱しており、うまく設計されていません;) –

+0

ちょっと間違っています。 "formatter.setTimeZone(local);" thx〜すべては今大丈夫です。 :P – alex

6

java.util.Dateは、タイムゾーンをサポートしていません。代わりにformatter.setTimeZone(tz)を呼び出して、TimeZoneをフォーマッタに渡す必要があります。

joda-timeは、日付の処理に適しています。書式設定のためにはDateを使用すると問題はありませんが、i18nについては頼りにしないことが一般的なアドバイスです。 (そこでは廃止予定の多くのメソッドに注意してください)

各ユーザにタイムゾーンを設定させます。理想的には、ブラウザのロケールに基づいてタイムゾーンを提案/仮定します。 See here

常に、固定のタイムゾーン(好ましくはGMT/UTC)で日付を保存してください。このような場合には

+2

GMTで時刻を保存する場合は+1、「日付」を使用しない場合は-1 。 'Date'の使用には何も問題はありません。ちょうどある時点を定義しています。あなたがする必要があるのは、日付の書式設定を希望する 'TimeZone'をフォーマッタに伝えることだけです。 – SimonC

+0

@ SimonC - JVMのデフォルトのタイムゾーンを使用するため、Dateを使用するのは問題ありません。これは実際には(外部フォーマッタを使用して)フォーマットするのには問題ありませんが、使用しないことの一般的なアドバイスです。 – Bozho

+0

@BozhoなぜそれはOKではないと言うのですか?時代遅れの時からある時点の日付として 'Date'オブジェクトを扱い、カレンダーや書式を扱うときに正しいタイムゾーンを使うのであれば、間違ってはなりません。私。 'toString()'や 'getHours()'のような廃止予定のメソッドを呼び出さないでください。 – SimonC

0

私はいつもchange timezone in Linux

mv /etc/localtime /etc/localtime-backup 
ln -sf /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime 

それはまた、例えば、ログファイルを読み込むための役に立つことができます(私はそれらに掘る必要があるとき、私はいつもそれを毎回計算するのではなく、私のローカルタイムを参照してください)

0

カレンダーを使用する必要があると思います(一般的に、Dateオブジェクトよりも便利です)。ロケールとタイムゾーンで初期化されたカレンダーを作成した場合は、作成した日付を使用してcalendar.setDate()を実行できます。入力されたフィールドで別のカレンダーオブジェクトを作成すると、2つのカレンダーオブジェクトの比較ができます。

+0

あなたは "あなたのロケールとタイムゾーンで初期化されたカレンダーを作成"と言っています。 – alex

+0

確かに、ドキュメントを見ると、http://download.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html#Calendar(java.util.TimeZone、java.util。ロケール)では、独自のタイムゾーン/ロケールでカレンダーを作成できます。 – andrewmu

+0

申し訳ありませんが、例えば、インスタンスを取得することができます: '\t \t Calendar myCal = Calendar.getInstance(TimeZone.getTimeZone(" Europe/London ")); ' – andrewmu

関連する問題