Какой алгоритм представлен в Java для преобразования 12-часового формата меридиемов am / pm в 24-часовой формат? - PullRequest
0 голосов
/ 13 июля 2020

Мне нужно было преобразовать только часовую часть 12-часовой строки времени в 24-часовой формат. Меня не интересуют другие части строки даты, кроме часов. SimpleDateFormatter, как известно, содержит ошибки, и на самом деле меня больше интересует сам алгоритм преобразования. Итак, я хочу найти алгоритм для преобразования часовой части. Это пример неочищенной строки, содержащей часть часа: «12:15 PM». Иногда пробелов между минутами и меридием иногда нет. Иногда он также имеет символ 160. Поэтому перед методом преобразования я проверяю и очищаю части строки, а затем передаю затем меридием (am или pm) и час методу, который возвращает час в 24-часовом формате int.

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

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 не равно 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"));

12

Каждый читатель может решить для себя: реализация какого метода требует меньше энергии, чтобы понять, торопитесь ли вы, ваш или мой?

Ссылка: Oracle учебник: Дата Время объяснение как использовать java .time.

0 голосов
/ 13 июля 2020

Это мой наивный код стиля для начинающих, чтобы преобразовать час в 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;
}
...