-2

我只需要将 12 小时时间字符串的小时部分转换为 24 小时格式。我对日期字符串的小时部分不感兴趣。SimpleDateFormatter 是出了名的错误,事实上我对转换算法本身更感兴趣。所以我想要的是找到转换小时部分的算法。这是包含小时部分的未清理字符串的示例:“12:15PM”。有时分钟和午时之间有空格,有时没有。有时它也有字符 160。所以在转换方法之前,我检查并清理字符串部分,然后将 meridiem(am 或 pm)和 hour 提供给将小时作为 24 小时格式 int 返回的方法。

4

2 回答 2

0

java.time

我建议使用现代 Java 日期和时间 API java.time,而不是您自己的日历实现。它可以在所有语言环境中使用。

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h:mma", Locale.ENGLISH);
    
    String timeString12Hours = "12:15PM";
    
    LocalTime time = LocalTime.parse(timeString12Hours, formatter);
    System.out.println("Time: " + time);
    int hour = time.getHour();
    System.out.println("Hour of day in 24 hour format: " + hour);

输出是:

Time: 12:15
Hour of day in 24 hour format: 12

我们从 java.time 免费获得的是验证。此代码将检测是否meridiem不是AMor PM,或者小时是否超出 1 到 12 的范围,或者根本不是数字。

在任何情况下都不要使用SimpleDateFormat问题中提到的类。这是一个臭名昭著的麻烦制造者,而且早已过时。

编辑:如果为了与我不知道的旧代码兼容,并且您现在没有时间清理,您需要自己答案中的方法签名:

private static DateTimeFormatter meridiemHourFormatter
        = DateTimeFormatter.ofPattern("ahh", Locale.ENGLISH);

public static int convert12to24(String meridiem, String hour) {
    String meridiemHour = meridiem + hour;
    return LocalTime.parse(meridiemHour, meridiemHourFormatter).getHour();
}

尝试一下:

    System.out.println(convert12to24("PM", "12"));

12

每个读者都可以自己决定:哪种方法实现需要更少的精力来理解,是你的还是我的?

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

于 2020-07-13T02:43:46.340 回答
0

这是我为初学者准备的将 12 小时格式的小时转换为 24 小时格式的天真的代码。

public static int convert12to24(String meridiem, String hour) {
    //meridiem is that am or pm,
    meridiem = meridiem.toLowerCase();
    int h_12 = 0;
    int h_24 = 0;
    try {
        h_12 = Integer.parseInt(hour);
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
    if (h_12 == 12) {
        //this is the midnight hour
        if (meridiem.contains("am")) {//generally before noon
            h_24 = 0;
        } else {//this is the hour starting at noon
            h_24 = 12;
        }
    } else if (h_12 >= 1)//all the rest
    {
        if (meridiem.contains("am")) {
            //hour starting after first hour at midnight to 11 facing noon
            h_24 = h_12;
        } else {//pm hours starting right after first hour after noon
            h_24 = h_12 + 12;
        }
    }

    return h_24;
}
于 2020-07-13T00:04:05.160 回答