【问题标题】:Parse time of format hh:mm:ss [closed]格式 hh:mm:ss 的解析时间 [关闭]
【发布时间】:2012-08-13 06:03:57
【问题描述】:

如何解析 hh:mm:ss 格式的时间,作为字符串输入以在 java 中仅获取整数值(忽略冒号)?

【问题讨论】:

  • 欢迎来到 Stack Overflow!我们鼓励您research your questions。如果您有tried something already,请将其添加到问题中 - 如果没有,请先研究并尝试您的问题,然后再回来。
  • 您可以查看 SO FAQHow to Ask 以更好地了解此处适合哪些类型的问题。
  • 试着用你的感觉写你的问题。人们会评论(也许编辑)您的问题以帮助您。请记住,最好问一个保持安静的愚蠢问题(因为有些愚蠢的问题可以用“你错了”来回答)。
  • 用谷歌找到了这个,它正是我要问的问题和我正在寻找的答案。如果那不是 Stack Overflow,我不知道是什么。

标签: java date string-parsing


【解决方案1】:

根据 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 的用法非常相似。
  • 由于时间即时 int 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 小时格式等的小时数)。有关详细信息,请查看链接中的文档

  • 一旦你从你的字符串中创建了一个 Date 对象(通过 SimpleDateFormat),不要试图使用 Date.getHour()、Date.getMinute() 等。它们有时可能会起作用,但是总体而言,它们可能会产生不好的结果,因此现在已弃用。如上例所示,请改用日历。

【讨论】:

  • 非常感谢您的理解和回答。
  • Java 1.4 已经很老了。更新文档链接。
  • 'hh' 预计小时为上午/下午 (1-12)。由于您在自己的示例中使用 13:24:40,也许您应该在日期格式中使用 'HH'
  • 使用 java 8 你可以,LocalTime lt = LocalTime.parse("14:23:57");
  • 这个答案现在已经过时了,使用麻烦的旧日期时间类现在被 java.time 类取代。
【解决方案2】:

有点冗长,但这是 standard 在 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:这只是一个例子。
  • 我明白,但鉴于 OP 自称是初学者,我希望他们明白,示例的这一部分不是他们应该从字面上理解的内容。
  • 让 yshavit 开心:JOptionPane.showMessageDialog(null, e);
  • 更新:在 2014 年之前,它在 Java 中解析和格式化时间的标准方法。
【解决方案3】:
String time = "12:32:22";
String[] values = time.split(":");

这将花费您的时间并将其拆分到看到冒号的位置并将值放入数组中,因此您应该在此之后有 3 个值。

然后循环遍历字符串数组并转换每一个。 (Integer.parseInt)

【讨论】:

    【解决方案4】:

    如果你想提取小时、分钟和秒,试试这个:

    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]);
    

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 2011-10-28
      • 2021-12-11
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多