2

JSON ファイルから日付を取得していますが、これは文字列形式です。意図から currentActivity に送られる startdate と enddate という名前の日付の 2 つの文字列値があります。今、jsonファイルからの日付値が開始日より後か終了日より前かを確認したいと思います。これどうやってするの?はい、私が持っているjsonファイルの形式は「yyyy-mm-dd」です。

JSON データは次のようになります。

{"posts":[{"start_date":"2013-02-15","end_date":"2013-02-21"}]}

これが私が試したコードですが、Mon Jan 07 00:00:00 GMT+5:30 2013として出力されています:

Intent intent = getIntent();
String startDate = intent.getStringExtra("startDate"); //I have check this. It is proper.
String endDate = intent.getStringExtra("endDate"); //I have check this. It is proper.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date start = null,end = null;
try {
start = sdf.parse(startDate);
end = sdf.parse(endDate);
} catch (ParseException e1) {
e1.printStackTrace();
}

日付を比較するコードは次のとおりです。

Date date = null;  
try {
    date = sdf.parse(c.getString(TAG_DATE)); //I am getting the date from a json file here.
} catch (ParseException e) {
    e.printStackTrace();
}
Date currDate = new Date();
if (end.compareTo(currDate) < 0 || start.compareTo(currDate) < 0) {
    Toast.makeText(getApplicationContext(),"Please select valid dates...",Toast.LENGTH_SHORT).show();
} else if (end.compareTo(currDate) == 0 && start.compareTo(currDate) >= 0){
    if (date.after(start)) {
        Toast.makeText(getApplicationContext(), "After...",Toast.LENGTH_SHORT).show();
    }
} else if (end.compareTo(currDate) > 0  && start.compareTo(currDate) >= 0) {
        if (date.after(start) && date.before(end)) {
        Toast.makeText(getApplicationContext(),"Before...",Toast.LENGTH_SHORT).show();
    }

}
4

3 に答える 3

3

Date日付文字列を実際の(またはCalendar)オブジェクトに変換することを含む、より堅牢なアプローチを使用することをお勧めします。

String startDateString = ...; // get date string from json
String endDateString = ...; // get date string from json
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date start = formatter.parse(startDateString);
Date end = formatter.parse(endDateString);

これ以降、egstart.before(end)またはを使用end.after(start)して、日付が別の日付の前か後かを確認できます。よりきめ細かい制御が必要な場合は、いつでもミリ秒単位で日付を取得し、ロジックを動作させることができます。


コードを更新しましたが、何が起こっているのか、さらに重要なことに、何が起こると予想しているのかを理解するのは私たちに任されていますか?現在の日付がjsonから取得した日付とどのように関連しているかを確認したいようですが、という名前の4番目の日付フィールドのdate目的に少し迷っています。

現在のスニペットについてのいくつかのコメント:

if (end.compareTo(currDate) < 0 || start.compareTo(currDate) < 0)

個人的にはbefore()after()はるかに読みやすく説明的なものだと思いますが、を使用しても問題はないと思いますcompareTo()。ただし、2つの日付の基になるミリ秒0表現が等しい場合にのみ返されることを理解することが重要です。そうは言っても、次の条件で最初のチェックを行うことがどれほど意味があるのか​​わかりません。

else if (end.compareTo(currDate) == 0 && start.compareTo(currDate) >= 0)

とまったく同じミリ秒を取得するには、本当に幸運である必要があります。すべての日付をたとえば深夜に正規化するためにどこかで何らかの操作を行わない限り、それが真実になる可能性はほとんどありません。endcurrDateend.compareTo(currDate) == 0

この正規化について:前述Calendarのクラスを見てください。これにより、日付スタンプ/タイムスタンプの個別のフィールドの値を簡単に取得できます。たとえば、日、月、年のみを比較するCalendar場合は、単純なget呼び出しを使用して、インスタンスからこれらの特定のフィールドを取得できます。さらに便利なのは、すべてのフィールドを個別に設定できることです。これは、すべての日付を深夜や正午などに正規化するのに最適です。その後も、before()andafter()メソッドを使用できます。

ニーズに合った実装を正しくコーディングするための十分な指針が得られるはずだと私は確信しています。あなたが何を達成しようとしているのかを正確に知らなければ、私はあなたをこれ以上助けることができないのではないかと思います。

于 2013-01-03T19:46:10.360 に答える
0

これを試すこともできます:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
boolean isBefore = new Date().before(sdf.parse("2013-02-15",0));

http://developer.android.com/reference/java/text/SimpleDateFormat.html

http://developer.android.com/reference/java/util/Date.html

于 2013-01-03T19:45:09.020 に答える
0

日付をダッシュ​​で展開すると、モバイルの日付と JSON による日付の比較が簡単になります。簡単な比較ロジックを使用すると、それを取得できます。

String date = "2013-02-15";
String[] separated = date.split("-");
separated[0]; // this will contain "2013"
separated[1]; // this will contain "02"
separated[2]; // this will contain "15"

Calendar c1 = Calendar.getInstance(); 
String date =  c1.get(Calendar.DAY_OF_MONTH);

カレンダー (モバイルの日付を取得する) http://developer.android.com/reference/java/util/Calendar.html

于 2013-01-03T19:39:05.167 に答える