如何在Java/Android中比较时间(给定字符串输入)?

8

我有两个字符串,格式为hh:mm,用于存储时间。我想比较这两个时间,以确定哪个时间更大。有什么最简单的方法吗?

3个回答

23

使用SimpleDateFormat和Date类。后者实现了Comparable接口,因此您应该能够使用.compareTo()方法进行实际比较。示例:

            String pattern = "HH:mm";
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            try {
                Date date1 = sdf.parse("19:28");
                Date date2 = sdf.parse("21:13");

                // Outputs -1 as date1 is before date2
                System.out.println(date1.compareTo(date2));

                // Outputs 1 as date1 is after date1
                System.out.println(date2.compareTo(date1));

                date2 = sdf.parse("19:28");         
                // Outputs 0 as the dates are now equal
                System.out.println(date1.compareTo(date2));

            } catch (ParseException e){
                // Exception handling goes here
            }

请参考SimpleDateFormat的文档获取格式化字符串。


1
谢谢你的回答。将来对我很有用。 - rogerstone
现在日期类还有其他方法,如openTime.before(currentTime)。 - Khizar Hayat

12

如果这些时间是指实际的 hh:mm(包括前导零,并以 24 小时格式表示),那么您可以通过字典排序来直接比较它们(即使用 String.compareTo(String))。这就是可排序格式的好处 :)

当然,这并不会检查两个值是否都是有效的时间。如果您需要执行此操作,则应解析两个时间:检查长度、检查冒号、解析两个子字符串,可能将小时数乘以 60 并加上分钟数以得到总分钟数。然后,您可以比较这两个总数。

编辑:正如评论中提到的那样,如果出于某种原因您确实需要解析这些值,我个人建议使用Joda Time(可能是精简版本,考虑到移动设备的特点),而不是SimpleDateTimeFormatDate。Joda Time 是比内置日期和时间 API 更好用的 API。


非常好的答案。简单的字符串比较正是我想要的。顺便说一下,如果我们使用适当的格式(如yyyy-mm-dd),我们也可以以同样的方式比较日期。谢谢你的回答。 - rogerstone
@rogerstone:我已经添加了我的答案,向您展示如何比较日期。 - Wroclai
@rogerstone:是的,如果您将日期存储在yyyy-MM-dd格式中,将日期/时间存储在yyyy-MM-dd HH:mm:ss格式中,您始终可以进行词典排序。 - Jon Skeet
午夜对字典比较不是很方便,因为我们知道00:00可能在23:59之后,但使用String.compareTo()会告诉我们23:59仅在00:00之后。 - TJ Thind
@TJThind:如果你要跨越到另一天,那么任何时间都可以在任何其他时间之后。11点后面是10点吗?如果我们谈论的是明天的10点,那就不是了。 - Jon Skeet
显示剩余6条评论

3

我之前在我的Android程序中编写了此功能的函数,我很乐意在下面分享源代码。

函数(稍后将使用“如何使用”代码进行解释):

public static void String setFormattedTimeString(final String formatExpr,
                                   final long timeStampInSeconds) {     
    final Date dateFromTimeStamp = new Date(timeStampInSeconds);        
    final SimpleDateFormat simpleformat = new SimpleDateFormat(formatExpr);
    final String formattedDateInString = simpleformat.format(dateFromTimeStamp);        
    return formattedDateInString;
}

public static void Calendar setCalendar(final int year, final int month,
                                    final int day) {            
    final Calendar calendar = Calendar.getInstance();           
    calendar.set(Calendar.DAY_OF_MONTH, day);
    calendar.set(Calendar.MONTH, month);
    calendar.set(Calendar.YEAR, year);
    return calendar;            
}

public static void double timeDifferenceInDays(final Calendar firstDate,
                                     final Calendar secondDate) {
    final long firstDateMilli = firstDate.getTimeInMillis();
    final long secondDateMilli = secondDate.getTimeInMillis();
    final long diff = firstDateMilli - secondDateMilli;   

    // 24 * 60 * 60 * 1000 because I want the difference in days. Change
    // as your wish. 
    final double diffDays = (double) diff / (double) (24 * 60 * 60 * 1000);

    return diffDays;
}

以下是我如何使用它们来计算差异(以天为例)。在此示例中,我假设您有一个时间戳可用,否则您可以轻松更改:

// Here you maybe have a timestamp in seconds or something..    

// This is ONE Calendar.
final String yearString = MyToolClass.setFormattedTimeString("y", timestamp);
final int year = Integer.parseInt(yearString);                                                   
final String monthString = MyToolClass.setFormattedTimeString("M", timestamp);
final int month = Integer.parseInt(monthString);                                      
final String day_in_monthString = MyToolClass.setFormattedTimeString("d",
                                        timestamp);
final int day_of_month = Integer.parseInt(day_in_monthString);

final Calendar calendarOne = MyToolClass.setCalendar(year, month,
                                        day_of_month);   

// Same stuff for Calendar two.

// Calculate difference in days.
final double differenceInDays = MyToolClass.timeDifferenceInDays(calendarOne,
                                        calendarTwo); 

谢谢Victor。虽然这不是最简单的方法,但我会记住的。 - rogerstone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接