2011-11-21 145 views
16

我需要得到两个日期之间的分钟数。我知道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

它呢?它不适合我。另外,你为什么要分两次? –

+2

它对我来说工作得很好。输出是-360。 – Tyler

+0

我不知道为什么你得到零,但你的格式字符串是错误的。 HH是0到23之间的小时格式,但既然你也有一个格式字符,我假设你希望小时在1到12之间,你应该使用hh。目前,您的1:00:00 PM正在被解析为1:00:00 AM。 – Brigham

回答

5

我通过您的代码调试:有ParseExceptionGetItemDate()两个日期串状的:

无法解析的日期:2011年11月21日上午七时00分00秒

的问题是解析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”和LocaleUnable to parse DateTime-string with AM/PM marker

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

13

如果您的GetItemDate在任一日期失败,您将得到零。在catch语句中,放置一个println或debug来输出问题,看看它是否告诉了你一些事情。

而且,正如实践的问题,我会改变:

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

到:

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

这使您可以查看在IDE中的数学结果的机会。

+4

很多(最?)IDE有能力观察函数返回值,因此为此目的创建一个本地*只是*不应该是必需的。我仍然不会这样做两次。 –

+0

好的呼吁不要做两次分裂。我甚至没有注意到。 – Thom

+0

你可能比四舍五入更好,然后依靠你的意图当然。 2分59秒和4分0秒是59秒,比2差1分钟。 – Tom