web-dev-qa-db-ja.com

カレンダーの日付を文字列に変換しますか?

最初の日付がカレンダー形式で、他の日付が文字列(DD-MMM-yyyy)形式である2つの日付を比較する必要があります。そこで、カレンダーの日付の1つを文字列に変換し、compareToメソッドを使用したいと思います。

私は使用してみました:

SimpleDateFormat formatter=new SimpleDateFormat("DD-MMM-yyyy");  
String currentDate=formatter.format(view.getSelectedDay());    
8
Smitha

view.getSelectedDay()Calendarを返すと仮定すると、次のようになります。

String currentDate = formatter.format(view.getSelectedDay().getTime());

(これにより、Dateに渡すformat参照が得られます。)

それでも問題がない場合は、詳細をお知らせください。ちなみに「DD」ではなく「dd」も欲しいと思います。 SimpleDateFormatのように、「DD」はの日であり、「dd」はの日です。 ドキュメント。

11
Jon Skeet

ここに あなたの問題は解決されました。とにかく、なぜ文字列表現で日付を比較するのですか? here のようなDateオブジェクトを比較したほうがいいのではないでしょうか。 CalendarクラスのgetTime()メソッドを使用してDateオブジェクトを取得できます。

1
Andrey Atapin

値を比較して、ある日付が別の日付より前であるかどうかを判断しますか、それとも並べ替えますか?あなたがそうなら、辞書式順序付けのためにいくつかのソート順の落とし穴に反するかもしれません。

String s  = "12-11-2001";
String s2 = "13-11-2000";

int i = s.compareTo(s2);

System.out.println(i);

dATEとしてのs2はsの前にあるため、これの出力は-1であり、1である必要がありますが、昇順で並べ替えると、s2は辞書式順序でsの後になります。

文字列の日付をDateオブジェクトに変換してから、before()またはafter()を使用する方が賢明な場合があります。

1
mcfinnigan

日付を文字列として比較する場合は、SimpleDateFormat("yyyy-MM-dd")を使用する必要があります。 SimpleDateFormat("dd-MM-yyyy")形式を使用してそれらを比較すると、最下位の数値が最初にチェックされ、最上位の数値が最後にチェックされるため、ほとんどの場合間違っています。
dd-MM-yyyy形式を使用する必要がある場合は、文字列を分割し、年/月/日を正しい順序で比較して、正、負、またはゼロを返す関数を作成できます。

// Compares first date to second date and returns an integer
// can be used in a similar manner as String.CompareTo()
Public Static int CompareDates(String Date1, String Date2) {
    String[] splitDate1 = Date1.split("-");
    String[] splitDate2 = Date2.split("-");
    int ret = -1;

    if (splitDate1[2].CompareTo(splitDate2[2]) == 0) {
        if (spliDatet1[1].CompareTo(splitDate2[1]) == 0) {
            if (splitDate1[0].CompareTo(splitDate2[0]) == 0) {
                ret = 0;
            }
            else if (splitDate1[0].CompareTo(splitDate2[0]) > 0) {
                ret = 1;
            }
        }
        else if (splitDate1[1].CompareTo(splitDate2[1]) > 0) {
            ret = 1;
        }
    }
    else if (splitDate1[2].CompareTo(splitDate2[2]) > 0) {
        ret = 1;
    }
    Return ret;
}
0
Wayne

DateオブジェクトまたはCalendarオブジェクトを比較するのが最善だと思います。非常に分解されて、これを与えます:

  • Dateオブジェクトの比較

    final Calendar calendarDate = your_date_as_a_Calendar;
    
    final String stringDate = your_date_as_a_String;
    final SimpleDateFormat format = new SimpleDateFormat("DD-MMM-yyyy");
    
    final Date dateA = calendarDate.getTime(); // this gives the absolute time, that actually embeds the date!
    final Date dateB = format.parse(stringDate);
    
    final int comparison = dateA.compareTo(dateB);
    
  • Calendarオブジェクトの比較

    final Calendar calendarA = your_date_as_a_Calendar;
    
    final String stringDate = your_date_as_a_String;
    final SimpleDateFormat format = new SimpleDateFormat("DD-MMM-yyyy");
    
    final Calendar calendarB = new GregorianCalendar();
    calendarB.setTime(format.parse(stringDate));
    
    final int comparison = calendarA.compareTo(calendarB);
    

そして、comparison< 0の場合はA < B> 0の場合はA > B、等しい場合は== 0になります 日付のドキュメント または カレンダーの

注意しなければならないのは次のとおりです。

  • 時刻:Calendarの賭けをStringと同じ日に設定する必要がありますが、時間が異なると、これは機能しません(比較していますインスタント、ここ)

  • SimpleDateFormatのパターン:Stringの形式と一致する必要があります。一致しないと、奇妙な結果になります。

  • ロケール:日付は同じ瞬間を参照している場合がありますが、異なるタイムゾーンで表現されている場合は異なります。 TimeZoneを使用するときにCalendarを処理する必要があることを処理する必要がある場合( Calendar および TimeZone のドキュメントを参照してください) =詳細については)。

0
Shlublu