两个日期之间的差异(以分钟为单位)

2022-09-02 21:47:02

我需要获取两个日期之间的分钟数。我知道Joda是最好的选择,但这是针对Android项目的,所以我更喜欢使用一些外部库,而且我正在构建的应用程序不需要计算是外科手术式的精确。

但是,我使用的代码似乎不起作用。我试图获取“11/21/2011 7:00:00 AM”和“11/21/2011 1:00:00 PM”(应该是360分钟)之间的分钟数,但我使用的代码返回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));
}

答案 1

如果您的 GetItemDate 在任一日期失败,您将获得零。在 catch 语句上,放置一个 println 或 debug 来输出问题,看看这是否能说明什么。

另外,作为一个练习问题,我会改变:

return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));

自:

long result = ((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));
return (int) result;

这使您有机会在 IDE 中查看数学运算结果。


答案 2

我通过您的代码进行了调试:对于两个日期字符串,例如:ParseExceptionGetItemDate()

不可解析日期: 2011/11/21 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”和:无法使用AM / PM标记解析DateTime字符串Locale

PS.我来自芬兰,所以我必须使用“Locale.US”部分才能工作。我认为,美国居民可能会在没有它的情况下测试代码。