2012-01-07 23 views
1

以下の2つのタイムスタンプを比較したいと思います。それはtrueを返すはずですが、2つのタイムスタンプの1桁と2桁のミリ秒のために、それはfalseを返しています。私はそれがtrue2つのタイムスタンプの比較

public static void main(String[] args) throws ParseException { 
    String d1 = "2011-12-31 07:11:01.5"; 
    String d2 = "2011-12-31 07:11:01.50"; 
    SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); 
    SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS"); 

    Date dateOne = s1.parse(d1); 
    Date dateTwo = s2.parse(d2); 

    System.out.println(dateOne.equals(dateTwo)); 
} 

答えて

0

を返す作るために何ができるだけで(あなたがミリ秒を考慮したくないと仮定して)これを試してみてください。

SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
     Date dateOne = s1.parse(d1);  
     Date dateTwo = s1.parse(d2);  
System.out.println(dateOne.equals(dateTwo)); 
1

問題はS記号はミリ秒の数字を解析していることです。常に。したがって、最初のケースでは、「.5」は5ミリ秒として解析され、「.50」は50ミリ秒として解析されます。それらのどちらも0.5秒として解析されていません。私はそれがあなたが望むものだと考えています。

悲しいことに、これはSimpleDateFormatの欠点です。 decisecondまたはcentisecondのフィールドを解析またはフォーマットする方法はありません。

私は最後にこれを実行しなければなりませんでした(正式には日付ではなく時間だけ)。私は手作業で構文解析を行いました。文字列を正規表現で分割し、フィールドを手作業でミリ秒単位に変換しました。小数点以下の秒のフィールドをスライスして手動で解析し、残りの文字列をSimpleDateFormatで解析することができます。

代わりに、末尾のゼロを文字列に塗りつぶすため、小数点以下の桁数は常に3桁になり、正しく解析されます。醜いですが、少なくとも単純です。

1

equalsfalseを返します。これらの2つの文字列は異なります。.5.05と解釈されます)は、.50と同じにすることはできません。 Datesを比較する場合は、compareToを使用することをお勧めします。

そして、私はこのように一つだけSimpleDateFormatを使用します。だから私の提案はこれらが

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS"); 

Date dateOne = format.parse(d1); 
Date dateTwo = format.parse(d2); 

  • あなたが本当に同じものを異なる値を持つようにしたい場合は、との文字列としてそれらを比較いくつかの正規表現(私はこの解決策をお勧めしません)。
  • Dateに変換すると、が同じではないため、異なる場合があります。 (ここでは他の人のようにお勧め)
  • それとも、パターンから.SS一部を除去することができますが、その後、あなたは精度を失うことになる...
0

SimpleDateFormatのはとして整数として最後の部分を解釈し、いないようです小数部分。明らかな解決策は、最後に常に3桁の数字があることを確認し、そうでない場合は右のパッドに0を付けることです。

次に、パターンyyyy-MM-dd HH:mm:ss.SSSを使用して解析します。

+0

これは動作しません。 '.SS'と同じ結果が得られます。 – user219882

+0

'ss.S'や' ss.SSS'の解析には何を使用しても構いません。フォーマットにのみ使用されます。私の答えで引用したjavadocの部分を参照してください – Robin

+0

@Tomas。あなたは、常に3桁の数字があることを確認するために、文字列をゼロで右パッドするように指示するとき、その部分を見逃しました。 –

0

SimpleDateFormatのJavadocを参照してください:

番号:フォーマットに、パターン文字の数は最小桁 数、短い数字がこの量までゼロパディングされています。 解析には、隣接する2つのフィールドを区切るのに、 が必要でない限り、パターン文字の数は無視されます。あなたのSimpleDateFormat建設中

だからあなた.S.SSのみをフォーマットするためではなく、解析のために使用されています。 equalsチェックは、getTime値がDateクラスのequalsメソッドのドキュメントのように、両方で異なるため、falseを返します。 d1の場合は5ミリ秒、d2の場合は50ミリ秒です。

したがって、SimpleDateFormatでは、これらの2つのインスタンスは決して等しくありません。ミリ秒を無視するか、可能であれば入力文字列を調整することもできます。

2

その他の理由はすでに回答しています。ここでの出発点は、それを回避するためにです:

import java.text.*; 
import java.util.Date; 

public class DatePercentage { 

    private final SimpleDateFormat dateFmt = new SimpleDateFormat(
           "yyyy-MM-dd HH:mm:ss"); 
    private final DecimalFormat decFmt = new DecimalFormat(); 

    public Date parse(String text) throws ParseException { 
     ParsePosition pos = new ParsePosition(0); 
     Date d = dateFmt.parse(text, pos); 

     if (d == null) { 
      throw new ParseException("Could not parse " + text + ": " + pos, 
            pos.getErrorIndex()); 
     } else if (pos.getIndex() < text.length()) { 
      Number dec = decFmt.parse(text, pos); // % milliseceonds 
      double pct = dec == null ? 0 : dec.doubleValue(); 

      if (0 < pct && pct < 1) { 
       long moreMillis = Math.round(pct * 1000); 
       d = new Date(d.getTime() + moreMillis); 
      } 
     } 
     return d; 
    } 

    public static void main(String[] args) throws ParseException { 
     String date = "2011-12-31 07:11:01"; 
     String [] millis = {"", ".5", ".50", ".500", ".5001", 
          ".051", ".5009", "garbage"}; 

     DatePercentage dp = new DatePercentage(); 

     for (int i = 0; i < millis.length; i++) { 
      String str = date + millis[i]; 
      System.out.format("%2s: %26s -> %tQ%n", i+1, str, dp.parse(str)); 
     } 
    } 
} 

は出力:

1:  2011-12-31 07:11:01 -> 1325333461000 
2:  2011-12-31 07:11:01.5 -> 1325333461500 
3:  2011-12-31 07:11:01.50 -> 1325333461500 
4: 2011-12-31 07:11:01.500 -> 1325333461500 
5: 2011-12-31 07:11:01.5001 -> 1325333461500 
6: 2011-12-31 07:11:01.051 -> 1325333461051 
7: 2011-12-31 07:11:01.5009 -> 1325333461501 
8: 2011-12-31 07:11:01garbage -> 1325333461000