2012-02-20 18 views
4

のために、私は私がこれに沿ってより多くのです実現私の代わりに通常の3の2ミリ秒の所でフォーマットする日付と文字列を与えるためにDateFormatのライブラリを取得しようとしているとの問題を抱えていますCenti-secondsのラインですが、afaik Javaはそれをサポートしていません。ここでのJava DateFormatの2ミリ秒の精度

は私が午前問題を示すためにいくつかのコードです。私はそれが2ミリ秒に出力すると期待しますが、それは3つを出力します。

public class MilliSeconds { 
private static final String DATE_FORMAT_2MS_Digits = "yyyy-MM-dd'T'HH:mm:ss.SS'Z'"; 
private static DateFormat dateFormat2MsDigits = new SimpleDateFormat(DATE_FORMAT_2MS_Digits); 

public static void main(String[] args){ 
    long milliseconds = 123456789123l; 
    System.out.println(formatDate2MsDigits(new Date(milliseconds))); 
} 

public static String formatDate2MsDigits(Date date) 
{ 
    dateFormat2MsDigits.setCalendar(Calendar.getInstance(new SimpleTimeZone(0, "GMT"))); 
    return dateFormat2MsDigits.format(date); 
}} 

出力:

1973-11-29T21:33:09.123Z

私は結果の文字列を解析し、私はしたくない数字を削除しますが、私ができこれを達成するためのよりクリーンな方法があることを期待していました。誰もがこれを動作させる方法を知っていますか、それともなぜ動作していませんか?

答えて

3

申し訳ありません。 javadoc

た内容に応じて、2つの隣接するフィールド

を分離するために を必要なのを除いて数コンポーネントの文字の数は無視されます...ので、私はそれを行うための直接的な方法はないと思います。

私だけSSSのために別の形式を使用するとsubstring(0, 2)を呼び出します。

+0

ありがとう、私はミリ秒単位で別のフォーマットをとることは考えていませんでした。 – Lithium

+2

Zuluの時間インジケータがなくても、一度にすべてを行うのはそれほど複雑ではないかもしれません。最後の文字を切り捨て、Zを追加します。 – msandiford

0

なぜ問題が起こったのか推測できませんでしたが、日付形式をyodaに置き換えた後、生成された時間文字列には正しい秒数[2]しかありませんでした。

+1

私はそれがメソッド契約だと思う。 Sと言うと、1から3桁のミリ秒です。 SSは2〜3桁のmsです。 SSSは常に3桁です。 yodaに別の契約があるのか​​もしれない。 – helios

+0

@helios、あなたは正しいです。 SSの場合、3桁目が0の場合にのみ2桁しか表示されません。 – bbaja42

0

私はJoda Timeが含まれており、のようなものを使用します:あなたは、追加の依存関係をしたくない場合は

private static final String DATE_FORMAT_2MS_FMT = "yyyy-MM-dd'T'HH:mm:ss.SS'Z'"; 

private static final DateTimeFormatter DATE_FORMAT_2MS_DIGITS = DateTimeFormat 
     .forPattern(DATE_FORMAT_2MS_FMT).withZoneUTC(); 

public static String formatDate2MsDigits(Date date) { 
    return DATE_FORMAT_2MS_DIGITS.print(date.getTime()); 
} 

を、私は.format(...)から結果の文字列をいじることは唯一の方法だと思います。

関連する問題