我从JSON文件获取日期,并且它是字符串格式。我有两个日期名为startdate和enddate的字符串值,它们从intent到currentActivity。现在我想检查一下,如果来自json文件的日期值是在startdate之后还是在enddate之前。我怎样才能做到这一点?是的,我json文件的格式是“yyyy-mm-dd”。
JSON数据看起来像:
{ “职位”:[{ “起始日期”: “2013年2月15日”, “END_DATE”: “2013年2月21日”}]}
以下是我尝试的代码,但我的输出为 Mon Jan 07 00:00:00 GMT + 2013年5月30日:
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();
}
}
答案 0 :(得分: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);
从这里开始,您可以使用例如start.before(end)
或end.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
类。它允许您轻松检索日期戳/时间戳的单独字段的值。例如,如果您只想比较日,月和年,则可以通过简单的get调用从Calendar
实例获取这些特定字段。更方便的是,您还可以独立设置每个字段 - 这对于将所有日期标准化为例如午夜或中午,您仍然可以使用before()
和after()
方法。
我确信应该给你足够的指针来正确编写适合你需求的实现。如果不知道你想要达到什么目标,我恐怕无法再帮助你了。
答案 1 :(得分: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
答案 2 :(得分: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