我需要获得两个日期之间的分钟数。我知道Joda是最好用的,但这是一个Android项目,所以我更喜欢使用一些外部库,而我正在构建的应用程序不需要通过手术精确计算。
但是,我使用的代码似乎不起作用。我正试图获得“11/21/2011 7:00:00 AM”和“11/21/2011 1:00:00 PM”之间的分钟数(应该是360分钟),但是代码I我正在使用返回0:
int diff = minutesDiff(GetItemDate("11/21/2011 7:00:00 AM"), GetItemDate("11/21/2011 1:00:00 PM"));
public static Date GetItemDate(final String date)
{
final Calendar cal = Calendar.getInstance(TimeZone.getDefault());
final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss a");
format.setCalendar(cal);
try {
return format.parse(date);
} catch (ParseException e) {
return null;
}
}
public static int minutesDiff(Date earlierDate, Date laterDate)
{
if( earlierDate == null || laterDate == null ) return 0;
return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));
}
答案 0 :(得分:15)
如果您的GetItemDate在任何一个日期失败,您将获得零。在catch语句中,放置println或debug来输出问题,看看是否能告诉你什么。
另外,作为一种惯例,我会改变:
return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));
为:
long result = ((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));
return (int) result;
这使您有机会在IDE中查看数学结果。
答案 1 :(得分:5)
我通过您的代码进行了调试:ParseException
中有两个日期字符串GetItemDate()
,如:
Unparseable date:11/21/2011 07:00:00 AM
问题在于解析AM / PM小时仅适用于“hh”(小型大写!)或“KK”。至少在我的手机中就是这种情况(似乎我们中的一些人根本没有看到这个问题)。我测试它也适用于单个“h”。
hh = 1-12
KK = 0-11
HH = 0-23
kk = 1-24
将您的SimpleDateFormat
行更改为:
final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US);
这篇文章解释了“a”和Locale
:Unable to parse DateTime-string with AM/PM marker
PS。我来自芬兰所以我必须使用“Locale.US”部分来实现这个目的。我想,美国居民可能会在没有它的情况下测试代码。