0

私がこれをするとき:

Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
c.set(9999, 11, 31, 0, 0, 0);
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yy HH.mm.ss.SSSSSSSSS a");
String date = formatter.format(c.getTime());
assertEquals("31-Dec-99 00.00.00.000000000 AM", date);

私はこれを取得します:99年12月30日18.00.00.000000318 PM

どうすれば欲しい時間を得ることができますか?

4

2 に答える 2

3

フォーマットを実行する前に、フォーマッタのタイムゾーンも設定する必要があります。

formatter.setTimeZone(c.getTimeZone());

それ以外の場合は、プラットフォームのデフォルトのタイムゾーンを使用します。


具体的な問題とは関係なく、カレンダーはナノ秒を保持しないため、フォーマット後もパーツが少しずれている可能性があります。

于 2013-01-18T18:02:23.390 に答える
0

タイムゾーンを指定せずにを作成しているSimpleDateFormatterため、デフォルトでシステムのローカルタイムゾーンが使用されます。フォーマッタでUTCも使用する場合は、設定するだけです。

Date値はタイムゾーンに依存しないことに注意してください。これは、Unixエポックからのミリ秒数にすぎません。それを作成するために最初にどのタイムゾーンが使用されたかはわかりません。setTimeZoneそのため、フォーマッターを呼び出す必要があります(または、ゾーンを取得するコンストラクターを使用します)。

ミリ秒単位の318は、元のDate値に318のミリ秒成分が含まれていることを示しています。Ajava.util.Dateはとにかくミリ秒の解像度のみをサポートするためSSS000000、フォーマットで使用する必要があります...そしてミリ秒値を0に設定する必要があります。

c.set(Calendar.MILLISECOND, 0);

(迷惑なことに、「年、月、日、時、分、秒」を設定してもミリ秒の値はリセットされません。私には気が狂っているようですが...)

ちなみに、組み込みのJava date / time APIは、さまざまな点でかなり厳しいものです。代わりにJodaTimeの使用を検討することをお勧めします...

于 2013-01-18T18:02:34.393 に答える