格式为hh:mm:ss的解析时间

57

我该如何在Java中解析格式为 hh:mm:ss 的时间字符串,并仅获取整数值(忽略冒号)?


6
欢迎来到Stack Overflow!我们鼓励您研究您的问题。如果您已经尝试过一些方法,请将其添加到问题中;如果没有,请先进行研究和尝试,然后再回来提问。 - David B
6
java.text.SimpleDateFormat 是一个用于格式化和解析日期时间的类。它允许您将日期时间对象转换为您需要的字符串表示形式,并将字符串表示形式转换回日期时间对象。该类使用指定的日期格式模式来创建格式化程序或解析器。您可以使用不同的日期格式模式来创建不同类型的日期格式,例如“yyyy-MM-dd”或“HH:mm:ss”。 - Sebastian Paaske Tørholm
2
你可以查看SO [FAQ]和[Ask],以更好地了解这里适合哪些类型的问题。 - Jim Garrison
3
我在谷歌上找到了这个帖子,它恰好提出了我想问的问题,并给出了我寻找的答案。如果这不是 Stack Overflow 的话,我也不知道还有什么是了。 - Kevin S.
1
这个问题正是我正在寻找的。也许表述不够完美,但它解决了我的问题! - Blisterpeanuts
显示剩余3条评论
4个回答

89

根据Basil Bourque的评论,这是对于此问题的更新答案,考虑了Java 8的新API:

    String myDateString = "13:24:40";
    LocalTime localTime = LocalTime.parse(myDateString, DateTimeFormatter.ofPattern("HH:mm:ss"));
    int hour = localTime.get(ChronoField.CLOCK_HOUR_OF_DAY);
    int minute = localTime.get(ChronoField.MINUTE_OF_HOUR);
    int second = localTime.get(ChronoField.SECOND_OF_MINUTE);

    //prints "hour: 13, minute: 24, second: 40":
    System.out.println(String.format("hour: %d, minute: %d, second: %d", hour, minute, second));

备注:

  • 由于 OP 的问题中包含一个仅包含小时、分钟和秒钟(没有日、月等)的具体时间示例,上面的答案只使用 LocalTime。如果想要解析还包含天、月等的字符串,则需要使用LocalDateTime。它的用法与 LocalTime 十分相似。
  • 由于 OP 的问题中的时间点不包含时区信息,答案使用日期/时间类的 LocalXXX 版本(LocalTime、LocalDateTime)。如果需要解析的时间字符串也包含时区信息,则需要使用ZonedDateTime

====== 以下是对这个问题的旧的(原始的)回答,使用 Java8 之前的 API: =====

很抱歉,如果我这样做会让任何人失望,但事实上我将回答这个问题。Java API非常庞大,我认为有时可能会错过其中的一个。

SimpleDateFormat 可能会解决这个问题:

http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

应该是这样的:

String myDateString = "13:24:40";
//SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
//the above commented line was changed to the one below, as per Grodriguez's pertinent comment:
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Date date = sdf.parse(myDateString);

Calendar calendar = GregorianCalendar.getInstance(); // creates a new calendar instance
calendar.setTime(date);   // assigns calendar to given date 
int hour = calendar.get(Calendar.HOUR);
int minute; /... similar methods for minutes and seconds

你应该注意的问题:

  • 你传递给 SimpleDateFormat 的模式可能与我的示例中的模式不同,具体取决于你有哪些值(小时是否为12小时制或24小时制等)。请查看链接中的文档以获取详细信息。

  • 一旦通过 SimpleDateFormat 将字符串创建为 Date 对象后,不要试图使用 Date.getHour()、Date.getMinute() 等方法。它们在某些时候可能有效,但总体上可能会给出错误的结果,并因此被弃用。像上面的示例一样使用日历。


1
Java 1.4相当古老了。请更新文档链接。 - Luiggi Mendoza
@LuiggiMendoza 没错,已更新链接。 - Shivan Dragon
4
“hh” 期望小时为上午/下午格式(1-12)。由于你在自己的示例中使用了13:24:40,也许你应该在日期格式中使用“HH”。 - Grodriguez
3
使用Java 8,您可以这样写:LocalTime lt = LocalTime.parse("14:23:57"); - Asanka Siriwardena
1
这个答案现在已经过时了,使用麻烦的旧日期时间类,现在已被 java.time 类所取代。 - Basil Bourque
显示剩余3条评论

13

有点啰嗦,但这是在Java中解析和格式化日期的标准方法:

DateFormat formatter = new SimpleDateFormat("HH:mm:ss");
try {
  Date dt = formatter.parse("08:19:12");
  Calendar cal = Calendar.getInstance();
  cal.setTime(dt);
  int hour = cal.get(Calendar.HOUR);
  int minute = cal.get(Calendar.MINUTE);
  int second = cal.get(Calendar.SECOND);
} catch (ParseException e) {
  // This can happen if you are trying to parse an invalid date, e.g., 25:19:12.
  // Here, you should log the error and decide what to do next
  e.printStackTrace();
}

除了默默地吞噬异常通常不是一个好办法。当出现问题时,这使得找出问题出在哪里变得很困难。 - yshavit
3
只是一个例子而已。 - João Silva
我理解,但考虑到原帖作者自称是初学者,我想让他们明白,示例中的那部分不应该被字面理解。 - yshavit
让yshavit高兴起来:JOptionPane.showMessageDialog(null, e); - Petro
更新:直到2014年,这仍然是Java中解析和格式化时间的标准方式。 - Ole V.V.

5
String time = "12:32:22";
String[] values = time.split(":");

这将花费你的时间,并在看到冒号时将其拆分并将值放入数组中,因此执行后应该有3个值。
然后循环遍历字符串数组并将每个值转换。 (使用Integer.parseInt)

2
如果您想提取小时、分钟和秒数,请尝试以下方法:
String inputDate = "12:00:00";
String[] split = inputDate.split(":");
int hours = Integer.valueOf(split[0]);
int minutes = Integer.valueOf(split[1]);
int seconds = Integer.valueOf(split[2]);

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