【C#】文字列から日付にParseExactで変換できない!FormatExceptionについて

スポンサーリンク
プログラミング

「文字列をフォーマット指定した上で、日付型に変換したい!」
そんな時に使う便利な変換メソッド「ParseExactメソッド」ですが、はじめて使用した際に頭を悩ませられた箇所がありましたので、備忘録兼情報共有のつもりで記事を作成します。

ParseExactメソッドとは

基本的に、日付を文字列に変換するにはParseメソッドを用いるのですが、「xxxx年xx月xx日」のような全角文字が混じった形だと変換できないということがあります。

そこで、フォーマットを指定しつつ、文字列を変換するParseExactメソッドが生まれたということです。

DateTime.ParseExact(変換元文字列, フォーマット, 書式情報);

上記のように引数を設定します。書式情報はnullで構いません。

ParseExactメソッドで文字列を日付に変換する方法

ParseExactメソッドで文字列(String型)を日付(DateTime型)に変換する方法を解説します。ParseExactメソッドは、「日時の文字列の書式」を指定してDateTime型に変換して戻り値として返します。

次のプログラムで確認してみましょう。

using System;

namespace Test
{
    class Test
    {
        static void Main()
        {
            //パターン1
            string strTime = "2022/09/05 00:00:00";
            string format = "yyyy/MM/dd HH:mm:ss";
            DateTime dTime = DateTime.ParseExact(strTime, format, null);

            Console.WriteLine(dTime); 

            //パターン2
            strTime = "2022年09月05日 00時00分00秒";
            format = "yyyy年MM月dd日 HH時mm分ss秒";
            dTime = DateTime.ParseExact(strTime, format, null);

            Console.WriteLine(dTime);

            //パターン3
            strTime = "20220905000000";
            format = "yyyyMMddHHmmss";
            dTime = DateTime.ParseExact(strTime, format, null);

            Console.WriteLine(dTime);
            Console.ReadLine();
        }
    }
}

▼出力▼

2022/09/05 00:00:00 //パターン1

2022/09/05 00:00:00 //パターン2

2022/09/05 00:00:00 //パターン3

FormatExceptionについて

本題のFormatExceptionが発生した状況について解説します。

私は以下のようにコーディングしました。

using System;

namespace Test
{
    class Test
    {
        static void Main()
        {
            //パターン1
            string strTime = "2022/09/05 23:45:41";
            string format = "yyyy/MM/dd hh:mm:ss";
            DateTime dTime = DateTime.ParseExact(strTime, format, null);

            Console.WriteLine(dTime); 
            Console.ReadLine();
        }
    }
}

しかし、FormatExceptionが発生してしまいました。

原因は下線部のフォーマットの指定が誤っていたからでした。

string format = "yyyy/MM/dd hh:mm:ss";

hhとHHではフォーマットの扱いが違いました。
hhは12時間表示で、
HHは24時間表示でした。

全然知りませんでした。。

フォーマットに使用される文字列のまとめ

せっかくなので、フォーマットで使用される文字列と意味をまとめておきました。

d – 先頭にゼロを付けない日付。例)1-31日
dd – 先頭に 0 を付けた日付。 例)1-31日
ddd – 曜日の略称。       例)日-土
dddd – 曜日の完全な名称。  例)日曜日-土曜日
f,ff,fff,ffff,fffff,ffffff,fffffff – 秒未満の単位。

h – 先頭にゼロを付けない12時間表示の時間。例)1-12時間
hh – 先頭にゼロを付けた12時間表示の時間。例01-12時間
H – 先頭にゼロを付けない24時間表示の時間。例)1-24時間
HH – 先頭にゼロを付けた24時間表示の時間。例)01-24時間

m – 先頭にゼロを付けない分単位。例)0-59分
mm -先頭にゼロを付けた分単位。例)00-59分

s – 先頭にゼロを付けない秒単位。例)0-59秒
ss – 先頭にゼロを付けた秒単位。例)00-59秒

M – 先頭にゼロを付けない月単位。例)1-12月
MM – 先頭にゼロを付けない月単位。例)01-12月
MMM – 月の略称。      例)Jan-Dec
MMMM – 完全な月の名前。   例)January-December

t – AM/PMの最初の文字のみ 例)A/P
tt – AM/PM 例)午前/午後

y – 世紀と先頭にゼロを付けない年。   例)0-99年
yy – 世紀を除いた年、先行ゼロ付き。 例)00-99年
yyyy – 年と世紀。 例)2022年
YYYY – 1年の最終週が翌年にまたがっている場合は翌年を返す。←ややこしいので注意

hhとHH、mmとMM、yyyyとYYYYあたりは抑えておくと良いかもしれません。

まとめ

こういった些細なミスで時間がとられないように、頭の片隅に置いておきたいところですね。

以上です。ここまでお読みいただきありがとうございました!

コメント

タイトルとURLをコピーしました