2

我从 JSON 文件中获取一个日期,它是字符串格式的。我有两个字符串值,名为 startdate 和 enddate,它们来自意图到 currentActivity。现在我想检查一下,来自 json 文件的日期值是在 startdate 之后还是 enddate 之前。我怎样才能做到这一点?是的,我 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);

从这里开始,您可以使用 eg start.before(end)orend.after(start)来检查日期是在另一个日期之前还是之后。如果您需要更细粒度的控制,您始终可以以毫秒为单位获取日期,并让您的逻辑工作。


所以你已经更新了你的代码,但是你把它留给我们来弄清楚发生了什么,更重要的是,你期望发生什么?看起来您想检查当前日期与从 json 检索到的日期之间的关系,尽管我对名为 的第四个日期字段date的用途有点迷茫。

只是关于当前片段的一些评论:

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

就个人而言,我发现before()并且after()更具可读性和描述性,但我认为使用compareTo(). 但是,重要的是要意识到只有当两个日期的基础毫秒表示相等0时才会返回。话虽如此,我不确定在以下情况下进行第一次检查有多大意义:

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

您必须非常end幸运才能获得与完全相同的毫秒数currDate。除非您在某处进行一些操作以将所有日期标准化为例如午夜,否则这不太可能end.compareTo(currDate) == 0是真的。

关于这个规范化:看看前面提到的Calendar类。它将允许您轻松检索日期戳/时间戳的单独字段的值。例如,如果您只想比较日、月和年,则可以通过Calendar简单的 get 调用从实例中获取这些特定字段。更方便的是您还可以独立设置每个字段 - 这非常适合将所有日期标准化为例如午夜或中午,之后您仍然可以使用before()andafter()方法。

我相信这应该为您提供足够的指针来正确编写适合您需求的实现。在不确切知道您要达到的目标的情况下,恐怕我无法为您提供任何进一步的帮助。

于 2013-01-03T19:46:10.360 回答
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 回答
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 回答