-1

问题出在Java

我想花时间输入如下

12:00 AM 11:42 PM

将有一系列这样的输入,直到N行。

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

1)12:00 AM

2)11:42 PM

但他们在同一行。

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

我知道SimpleDateFormat,但我不能修改它以满足我所说的需要。

所以请帮忙

4

5 回答 5

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());
          }
    }

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

于 2021-02-12T11:50:26.737 回答
0

正如大家所说,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 :andwhitespace例如: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使用Integer wrapper class,这将使您轻松进行任何类型的算术或比较计算。它简单明了,虽然有点长。

我希望我对你有所帮助。

于 2021-02-12T13:46:56.060 回答
0

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

此片段的输出是:

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

正则表达式(?<=M) 匹配前面有一个大写的空格M,所以这是输入字符串被分割的地方。

链接: Oracle 教程:解释如何使用 java.time 的日期时间。

于 2021-02-12T14:37:44.227 回答
0

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

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

        }

这给了你两个字符串ampm.

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

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm aa");
于 2021-02-12T11:38:06.033 回答
0

您正在寻找的格式是:hh:mm a.

来自 JavaDoc:

象征 描述 类型 例子
H 时钟时间-上午-下午 (1-12) 数字 12
一分钟 数字 30
一个 上午-下午 文本 下午
于 2021-02-12T11:41:30.863 回答