Java 中表示的将 12 小时 am/pm 子午线格式小时转换为 24 小时格式的算法是什么?

What is the algorithm represented in Java to convert an 12 hour am/pm meridiem format hour to 24 hour format?

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

这是我为初学者将 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;
}

java.time

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

    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 是否不是 AMPM,或者小时是否超出 1 到 12 的范围或根本不是数字。

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

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

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

每个 reader 都可以自己决定:如果赶时间,你的还是我的,哪种方法实现需要更少的精力去理解?

Link: Oracle tutorial: Date Time 解释如何使用 java.time.