C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で24時間制の時刻を12時間制(AM/PM)に変換する方法

このチュートリアルでは、24時間制で表された時刻を、AM/PM付きの12時間制フォーマットへ変換するC++プログラムについて解説します。

入力として「17:35:20」のような24時間形式の時刻文字列が与えられ、それを「5:35:20 PM」のような12時間形式へ変換するのが目的です。

変換の基本的な考え方

変換の手順はシンプルで、以下の3ステップで構成されます。

  • 時刻文字列の先頭2文字を数値として読み取り、「時」の値を求める
  • 時が12未満であれば「AM」、12以上であれば「PM」と判定する
  • 時を12で割った余りを新しい時刻とし、余りが0の場合は「12」と表示する(0時→12 AM、12時→12 PM)

サンプルコード

#include <bits/stdc++.h>
using namespace std;

// 12時間形式へ変換する関数
void convert_12hour(string str){
    // 先頭2文字から「時」を数値化
    int h1 = (int)str[0] - '0';
    int h2 = (int)str[1] - '0';
    int hh = h1 * 10 + h2;

    // 午前(AM)・午後(PM)の判定
    string Meridien;
    if (hh < 12) {
        Meridien = "AM";
    } else {
        Meridien = "PM";
    }
    hh %= 12;

    if (hh == 0) {
        // 0時・12時は「12」と表示
        cout << "12";
        for (int i = 2; i < 8; ++i) {
            cout << str[i];
        }
    } else {
        cout << hh;
        for (int i = 2; i < 8; ++i) {
            cout << str[i];
        }
    }
    cout << " " << Meridien << '\n';
}

int main(){
    string str = "17:35:20";
    convert_12hour(str);
    return 0;
}

実行結果

5:35:20 PM

コードの解説

まず、文字列の1文字目と2文字目からそれぞれ数字を取り出し、h1 * 10 + h2 によって「時」を整数値として復元しています。文字から数字への変換には、文字コードの差分を利用する - '0' というテクニックを使っています。

次に、その値が12未満かどうかで「AM」「PM」を判定します。その後 hh %= 12 で12時間制の時刻を求めます。ここで注意したいのは、0時と12時の扱いです。どちらも12で割った余りは0になるため、その場合は明示的に「12」と出力することで、「00:30:00 → 12:30:00 AM」「12:15:00 → 12:15:00 PM」といった正しい表記を実現しています。

分・秒の部分(文字列の3文字目以降)は変更不要なので、そのままループで出力しています。

まとめ

このように、文字列操作と簡単な条件分岐を組み合わせるだけで、24時間制から12時間制への変換は容易に実装できます。デジタル時計の表示やログ出力など、ユーザーにとって読みやすい時刻表示が必要な場面でぜひ活用してみてください。

  1. C++で解く「可能な限り陸地から遠い」問題 ― マルチソースBFSの実装例

    問題概要 N × N のグリッドが与えられ、各セルには 0(水)または 1(陸地)のいずれかが格納されています。この中から「最も近い陸地セルまでの距離」が最大となる水セルを 1 つ見つけ、その距離を返すのが目的です。距離の計算にはマンハッタン距離を使用します。2 つのセル (x0, y0) と (x1, y1) 間の距離は、次の式で定義されます。 |x0 − x1| + |y0 − y1| また、グリッド内に陸地が存在しない場合、または水が存在しない場合は -1 を返します。 入力例 101000101 この場合の出力は 2 となります。中央のセル (1, 1) は、すべての陸地セルからちょう

  2. C++で全従業員に緊急ニュースを伝えるのに必要な時間を求める方法(BFS活用)

    問題の概要ある会社にはn人の従業員が在籍しており、各従業員には0からn-1までの一意なIDが割り振られています。会社のトップ(社長)はheadIDで表されます。各従業員には必ず一人の直属の上司が存在し、それはmanager配列によって与えられます。manager[i]はi番目の従業員の直属の上司を意味し、社長の場合はmanager[headID] = -1となります。なお、組織の上下関係は木構造になっていることが保証されています。社長は緊急のニュースを全従業員に伝えたいと考えています。まず社長が直属の部下に連絡し、その部下たちがさらに自分の部下へと伝えていくことで、ニュースは組織全体へと広まっ