【问题标题】:How to check date(getting from json file) is before or after in android?如何在android中检查日期(从json文件中获取)是之前还是之后?
【发布时间】:2013-01-03 19:29:19
【问题描述】:

我从 JSON 文件中获取一个日期,它是字符串格式的。我有两个日期字符串值,分别命名为 startdate 和 enddate,它们来自 Intent 到 currentActivity。现在我想检查一下,来自 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();
    }

}

【问题讨论】:

  • 你能在 JSON 文件中发布一个日期格式的示例吗?
  • 哪一行给出了你描述的输出?

标签: java android json


【解决方案1】:

我更喜欢使用更强大的方法,将日期字符串转换为实际的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);

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


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

只是对当前sn-p的一些评论:

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

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

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

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

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

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

【讨论】:

  • 嘿,我尝试了你的代码,但它给出的转换日期为:Mon Jan 07 00:00:00 GMT+5:30 2013。我只想要“2013-01-07”,即 yyyy- MM-dd。
  • @Dhwani:嗯,是的,这是Date 的字符串表示;例如当您致电start.toString() 时,您会得到什么。如果您想以特定字符串表示格式化日期,请再次使用SimpleDateFormat。例如:formatter.format(start)(使用上述变量)将为您提供start"yyyy-MM-dd" 格式表示的日期。但是,这与您最初要求的完全相反...
  • 但是当我将它与日期进行比较时,它给了我错误的结果,所以我正在检查 Toast。
  • @Dhwani:请添加您用来进行比较的代码、您得到的结果以及您期望的结果。
  • @Dhwani:我已经根据您添加的代码更新了我的答案。但是,我之前评论中的 3 个问题中有 2 个仍未得到解答。我很乐意为您提供帮助,但您对细节并不是很慷慨……
【解决方案2】:

你也可以试试这个:

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

【讨论】:

    【解决方案3】:

    如果你用破折号分解日期 - 很容易比较移动日期和 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

    【讨论】:

    • 但我想比较两个日期。
    • 比较是什么意思?您已经通过 json 获得了日期以及之前的评论。 Calendar c1 = Calendar.getInstance(); String date = c1.get(Calendar.DAY_OF_MONTH);你可以比较日期和分隔[2]
    猜你喜欢
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多