用Java表示的将12小时am/pm meridiem格式转换为24小时格式的算法是什么?

用Java表示的将12小时am/pm meridiem格式转换为24小时格式的算法是什么?,java,date,time-format,datetime-conversion,timeofday,Java,Date,Time Format,Datetime Conversion,Timeofday,我只需要将12小时时间字符串的小时部分转换为24小时格式。我对日期字符串的其他部分不感兴趣。SimpleDataFormatter是出了名的bug,事实上我对转换算法本身更感兴趣。所以我想找到转换小时部分的算法。这是一个未清理字符串的示例,其中包含小时部分:“12:15PM”。有时在分钟和梅里迪姆之间有空格,有时没有。有时它也有160个字符。因此,在转换方法之前,我检查并清理字符串部分,然后将meridiem(am或pm)和hour输入方法,该方法将hour返回为24小时格式int。这是我的简单

我只需要将12小时时间字符串的小时部分转换为24小时格式。我对日期字符串的其他部分不感兴趣。SimpleDataFormatter是出了名的bug,事实上我对转换算法本身更感兴趣。所以我想找到转换小时部分的算法。这是一个未清理字符串的示例,其中包含小时部分:“12:15PM”。有时在分钟和梅里迪姆之间有空格,有时没有。有时它也有160个字符。因此,在转换方法之前,我检查并清理字符串部分,然后将meridiem(am或pm)和hour输入方法,该方法将hour返回为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);
输出为:

我们从java.time免费获得的是验证。此代码将检测
meridiem
是否不是
AM
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"));
十二,

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


链接:解释如何使用java.time。

感谢您回答自己的问题。该代码输入正确。我希望看到更好的验证
convert12to24(“xx”,“01”)
应该抛出异常,但它只返回13
convert12to24(“lame arg”,“01”)
返回1
convert12to24(“PM”,“29”)
没有意义,但返回41。当然,它只不过是像起点一样的压缩伪代码。任何人都可以在方法之前、之后或内部添加他们的检查。谢谢你的代码示例。事情是,在匆忙中,人们倾向于坚持他们的旧工作。我们的目标是为那些没有精力学习java.time的人提取算法的核心。您似乎对问题的目标(什么是算法)感到困惑,因此我修改了问题,以便更准确地描述目标。问题和公认的答案必须完全与算法有关。使用黑盒库与算法无关。顺便说一下,通过定义理解部分,如果方法(即API)的签名相同,则没有区别。这是否回答了您的问题。我知道这个问题是关于JavaScript的,但算法是一样的。
    System.out.println(convert12to24("PM", "12"));