私は私のコードでは2つのファイルがあります:
ファイル1コンテンツ:
public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
ファイル2内容:
sdf.format(formatter.parse("2015-02-02")));
問題:数時間のために、最初はファイルに2枚の版画上記ライン「2015年2月2日午前12時00分00秒」、が、その後、それは「2015年2月1日午前六時00分00秒」を表示します。ここで問題になる可能性がどのような任意のアイデア。
追加情報:私のサーバーは米国にあるいくつかのクラウド・マシン上で実行されています。new java.util.Date( )
正しくすべての時間をUTCタイムゾーン値を与えます。サーバーは、コマンドを使用して開始されますjava -jar xyz.jar
。使用している他のファイルが存在しているsdf
とformatter
変数が。私は、ローカルマシン上でこれを再現することができません。問題は、サーバー上で起こって開始すると、サーバーが再起動されるまで、それは間違った日時を示しています。
使用java.time、現代の日付時刻API、および特にその:ネイサン・ヒューズと自分でコメントは答えに結合することが十分に良いですDateTimeFormatter
。
public static final DateTimeFormatter printFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
今、例えば、あなたの書式を5月には、次のように行きます:
String stringToPrint = LocalDate.parse("2015-02-02")
.atStartOfDay(ZoneOffset.UTC)
.format(printFormatter);
System.out.println(stringToPrint);
この版画:
2015年2月2日夜12時〇〇分00秒
フォーマット変換コードでは、私はあなたの元の文字列が、という事実を利用しています2015-02-02
、日付のための標準ISO 8601形式です。LocalDate
明示的なフォーマッタせずに、あるデフォルトとして、この形式を解析します。
何があなたのコードで間違っていましたか?
あなたが観察した行動のための2つの可能性の説明があることを、あなたの質問からと思われます。
- 2つのフォーマッタを使用して、サーバー上のプログラムの他のクラスの一つは、アメリカ/シカゴに例えばその一つのタイムゾーンを設定します。
- 二つ以上のスレッドが正しく動作するためにそれらのいずれかを引き起こす、同時にフォーマットを使用しています。
観察された行動、それを上げた後、それはサーバの再起動まで続く6時間の誤差は、あなたも、あなた自身の答えで確認し、それを行うためにあなたに感謝最初の説明、とより一致ようです。
反してSimpleDateFormat
、現代は、DateTimeFormatter
フォーマッタを修正するから、他のクラスを防止する、任意のスレッドの問題を防ぎ、スレッドセーフな、と不変です。だから、両方のケースで、あなたの問題を解決します。
余談として、私はあなたが小文字のあなたの誤った使用を知っていると思うhh
フォーマットパターン文字列インチ hh
あなたは大文字必要が一方で、01から12を介して、AMまたはPM内時間であるHH
00から23まで、一日の時間のために(これは両方のために行くSimpleDateFormat
とためDateTimeFormatter
)。
リンク: Oracleのチュートリアル:日付時刻を使用する方法を説明しますjava.time
。