【问题标题】:How to take Time Input in a line in Java? [closed]如何在 Java 中的一行中输入时间? [关闭]
【发布时间】:2021-02-12 11:21:23
【问题描述】:

问题在于 Java

我想花时间输入如下

12:00 AM 11:42 PM

会有一系列这样的输入,最多 N 行。

这里给出了两个不同的时间输入

1)12:00 AM

2)11:42 PM

但它们在同一行。

时间输入是单人进入(12:00 AM)和离开(11:42 PM)

我知道SimpleDateFormat,但我无法修改它以满足我所说的需求。

所以请帮忙

【问题讨论】:

  • 如果你把它放在一个字符串中并根据 Space Like Array = 12:00 | 拆分它会怎样?上午 | 11:42 | PM 并考虑 InTime = Array[0] + Array[1] OutTime = Array[2] + Array[3]
  • 在第二个空格处拆分行,然后使用 SimpleDateFormat 解析每个部分。如果您仍然卡住,请发布您的代码和有关仍然无法正常工作的详细信息。
  • 我建议你不要使用SimpleDateFormat。这个类是出了名的麻烦和过时。而是使用来自java.time, the modern Java date and time API 的DateTimeFormatter。

标签: java algorithm datetime datetime-parsing timeofday


【解决方案1】:

对于上述问题,正则表达式对于从输入字符串/文本中查找和收集值非常有帮助。如下所示。

public static void main(String[] args) {
        String input = "12:00 AM 11:42 PM";
        ArrayList<String> list = new ArrayList();
        Pattern pattern = Pattern.compile("[\\d:]*[ ](AM|PM)");
          //Matching the compiled pattern in the String
          Matcher matcher = pattern.matcher(input);
          while (matcher.find()) {
             list.add(matcher.group());
          }
          Iterator<String> it = list.iterator();
          System.out.println("List of matches: ");
          while(it.hasNext()){
             System.out.println(it.next());
          }
    }

这里我们输入的字符串包含时间。 然后我们使用正则表达式来查找模式 我们正在将找到的匹配项收集到列表中。

【讨论】:

  • 感谢您的回答,但我从未遇到过 Pattern 和 Matcher 数据类型
【解决方案2】:

有很多方法可以做到这一点。我会使用正则表达式。

        String input = "12:00 AM 11:42 PM";
        String pattern = "(\\d+:\\d+ AM) (\\d+:\\d+ PM)";

        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(input);

        if(m.find()) {
            String am = m.group(1);
            String pm = m.group(2);

        }

这会为您提供两个字符串 am 和 pm。

然后您可以使用SimpleDateFormat 将它们解析为Date。

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm aa");

【讨论】:

    【解决方案3】:

    您要查找的格式是:hh:mm a。

    来自 JavaDoc:

    Symbol Desc Type Example
    h clock-hour-of-am-pm (1-12) number 12
    m minute-of-hour number 30
    a am-pm-of-day text PM

    【讨论】:

    • 感谢您的贡献。它并没有以我理解的方式真正回答问题,因为每行有两次。
    【解决方案4】:

    正如大家所说,regex 是最好的选择。我将为您提供一个简单的方法。我将在这里使用 BufferedReader 作为示例。随意使用任何input stream。

    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    

    对于 n 个输入,只需接受 n 并开始一个循环。

    int n = Integer.parseInt(bufferedReader.readLine().trim());
    for (int i = 0;i < n;i++)
    

    每次您将接受包含到达和离开日期的每一行输入作为单个表达式,并使用正则表达式将其拆分为 6 个部分,使用 delimiters @ 987654326@ 和whitespace。 例如:12:00 AM 11:42 PM 将被拆分为由元素 [12, 00, AM, 11, 42, PM] 组成的字符串数组。

    String[] in = bufferedReader.readLine().split("[: ]");
    
    //Array L to store HH MM XX of date of arrival at respective index
    String[] L = new String[3];
    L[0] = in[0];
    L[1] = in[1];
    L[2] = in[2];
    
    //Array R to store HH MM XX of date of departure at respective index
    String[] R = new String[3];
    R[0] = in[3];
    R[1] = in[4];
    R[2] = in[5];
    

    如果您想执行任何进一步的计算,这种方法会有所帮助。您还可以使用Integer wrapper class 将它们转换为Integer,这将使您轻松进行任何类型的算术或比较计算。它简单明了,虽然有点长。

    希望对你有所帮助。

    【讨论】:

      【解决方案5】:

      java.time 和正则表达式

      我建议您使用现代 Java 日期和时间 API java.time 来处理您的时间工作。有不同的方法可以将字符串一分为二来分隔其中的两次;我也喜欢正则表达式。 String.split() 接受一个。

          DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
          
          String inputLine = "12:00 AM 11:42 PM";
          String[] timeStrings = inputLine.split("(?<=M) ");
          if (timeStrings.length == 2) {
              LocalTime entering = LocalTime.parse(timeStrings[0], timeFormatter);
              LocalTime leaving = LocalTime.parse(timeStrings[1], timeFormatter);
              System.out.format("Entered %s, left %s.%n", entering, leaving);
          } else {
              System.err.println("Improper format: " + inputLine);
          }
      

      这个 sn-p 的输出是:

      00:00 进入,23:42 离开。

      正则表达式(?&lt;=M) 匹配前面带有大写字母M 的空格,因此这是输入字符串被分割的地方。

      链接: Oracle tutorial: Date Time 解释如何使用 java.time。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-01
        • 2012-09-29
        • 2021-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多