DateTimeをフォーマットしたい。。。
この記事は C# で DateTime を扱う方法を知りたいという方におすすめ記事です。
DateTime 型の基本的な使い方をはじめ、DateTime を文字列に変換する時に指定できるフォーマットについて詳しく紹介しています。
ぜひ最後まで読んでみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
DateTimeとは
C# には日付や時刻を操作する為の DateTime 型(構造体型)が存在します。現在の日時時刻の取得、指定した形式(フォーマット)で日時を文字列に変換して表示などさまざまな操作を行うことができます。
例えば、任意の日時を DateTime で指定する場合はコンストラクタに数値を渡します。
using System;
//年月日の指定
var dateTime1 = new DateTime(2022, 04, 01); // 2022年04月01日 0:00:00
//年月日時分秒の指定
var dateTime2 = new DateTime(2022, 04, 01, 11, 35, 20); // 2022年04月01日 11:35:20
DateTime には年月日や時間などのデータを簡単に扱う為のプロパティやデータを加工する為のメソッドが用意されています。
どんな種類のプロパティやメソッドが用意されているかを知っていることで、プログラミングの幅が広がります。
それではDateTime型について詳しくみてみましょう。
DateTimeで扱えるプロパティ
DateTime には日付と時刻の両方の情報を持っている構造体型で、「年:year」 「月:manth」 「日:day」 「時:hour」 「分:minute」 「秒:secound」 「ミリ秒:Millisecond」など読み取り専用のプロパティがあります。
プロパティを呼び出すだけで情報を取得することができます。
//DateTimeオブジェクトの生成
var dateTime = new DateTime(2022, 04, 01, 11, 35, 20, 368); // 2022年04月01日 11:35:20.368
//年
int year = dateTime.Year; //2022
//月
int month = dateTime.Month; //4
//日
int day = dateTime.Day; //1
//時間
int hour = dateTime.Hour; //11
//分
int minute = dateTime.Minute; //35
//秒
int second = dateTime.Second; //20
//ミリ秒
int millisecond = dateTime.Millisecond; //368
現在の日付、時刻または日時を取得する
DateTime で、現在の日付、時刻もしくは日時を取得するには 「Today」 「TimeOfDay」 「Now」を使用します。
//Today (日付のみ)
var todayDate = DateTime.Today; // 2022年03月30日 00:00:00
//TimeOfDay (時刻のみ)
var todayDate = DateTime.TimeOfDay; // 12:32:16.000
//Now (日付 + 時刻)
var nowDateTime = DateTime.Now; // 2022年03月30日 12:32:16
現在の曜日を取得する
DateTimeで、現在の曜日を取得するには 「DayOfWeek」を使用します。
//曜日
var nowDateTime = DateTime.Now;
var dayOfWeek = nowDateTime.DayOfWeek; // DayOfWeek.Wednesday
DayOfWeek プロパティはDayOfWeek型として戻り値を返します。DayOfWeek の列挙体で定義されている名前は英語なので、dayOfWeek.ToString() すれば英語表記で曜日の文字列(Sunday,Monday,,,)を取得することができます。
日本語表記で曜日の文字列を取得したい場合は、DayOfWeekで取得した数値から配列を参照して取得する方法があります。
//曜日(日本語)
var nowDateTime = DateTime.Now;
var dayOfWeeks = new string[]
{
"日曜日",
"月曜日",
"火曜日",
"水曜日",
"木曜日",
"金曜日",
"土曜日"
};
var dayOfWeek = dayOfWeeks[(int)nowDateTime.DayOfWeek]; // 水曜日
もしくは DateTime を文字列にフォーマットする時に、日本語のカルチャーを渡すことで日本語の曜日を取得することもできます。
//曜日(日本語)
var nowDateTime = DateTime.Now;
culture = new CultureInfo("ja-JP");
str = nowDateTime.ToString("dddd", culture); // 水曜日
DateTimeで扱えるメソッド
ここからは使用頻度が高いメソッドを紹介します。
文字列からDateTime型へ変換する
string 型から DateTime 型へ変換したい場合は、「Parse」、「TryParse」もしくは「TryParseExact」を利用しましょう。
Parse は変換したい文字列が DateTime へ変換できないと例外が発生するので、try-catch を使用します。
try
{
//Parseメソッドを使ってDateTime型へ変換
var dateTimeParse = DateTime.Parse("2022/4/1 11:35:20");
}
catch (Exception err)
{
MessageBox.Show($"変換失敗 : {err.Message}");
}
TryParse は変換に失敗した場合が考慮されており、変換に成功すれば「true」、失敗すれば「false」を戻り値として返します。
変換に成功すれば、out で指定した変数に日付データが格納されます。
var result = DateTime.TryParse("2022/4/1 11:35:20", out DateTime dateTimeParse);
if (!result)
{
MessageBox.Show("変換失敗");
}
TryParseExact は書式のフォーマットを指定して、文字列の書式が指定した書式と一致していれば DateTime 型へ変換します。
TryParse と同様で変換に失敗した場合に結果を戻り値として返します。変換に失敗した場合は、第4引数に「0001/01/01 0:00:00」が格納されます。
var format = "yyyy/MM/dd HH:mm:ss";
var cultureInfo = new CultureInfo("ja-JP");
var dateTimeStyles = DateTimeStyles.None;
var result = DateTime.TryParseExact("2022/04/01 11:35:20", format, cultureInfo, dateTimeStyles, out DateTime dateTimeParse);
if (!result)
{
MessageBox.Show("変換失敗");
}
TryParseExact は書式を指定できるので、例えば区切り文字がない数値だけの文字列(20220401113520)を変換することもできます。
実際にやってみると変換できていることが分かると思います。
var format = "yyyyMMddHHmmss";
var cultureInfo = new CultureInfo("ja-JP");
var dateTimeStyles = DateTimeStyles.None;
var result = DateTime.TryParseExact("20220401113520", format, cultureInfo, dateTimeStyles, out DateTime dateTimeParse);
if (!result)
{
MessageBox.Show("変換失敗");
}var format = "yyyy/MM/dd HH:mm:ss";
var cultureInfo = new Culture
日時を加減算する
任意の日時を加減算をするメソッドが用意されています。このメソッドを使用すれば、次の日の日付に変更したり、10分前の時間に変更することが可能です。
var nowDateTime = DateTime.Now; // 2022年03月30日 12:32:16
//年の加減算
var addYear1 = nowDateTime.AddYears(1); // 2023年03月30日 12:32:16
var addYear2 = nowDateTime.AddYears(-1); // 2021年03月30日 12:32:16
//月の加減算
var addMonth1 = nowDateTime.AddMonths(1); // 2022年04月30日 12:32:16
var addMonth2 = nowDateTime.AddMonths(-1); // 2022年02月30日 12:32:16
//日の加減算
var addDays1 = nowDateTime.AddDays(1); // 2022年03月31日 12:32:16
var addDays2 = nowDateTime.AddDays(-1); // 2022年03月29日 12:32:16
//時の加減算
var addHour1 = nowDateTime.AddHours(1); // 2022年03月30日 13:32:16
var addHour2 = nowDateTime.AddHours(-1); // 2022年03月30日 11:32:16
//分の加減算
var addMinute1 = nowDateTime.AddMinutes(1); // 2022年03月30日 12:33:16
var addMinute2 = nowDateTime.AddMinutes(-1); // 2022年03月30日 12:31:16
//秒の加減算
var addSecond1 = nowDateTime.AddSeconds(1); // 2022年03月30日 12:32:17
var addSecond2 = nowDateTime.AddSeconds(-1); // 2022年03月30日 12:32:15
//指定した時分秒の加減算
var timeSpan1 = nowDateTime + new TimeSpan(1, 10, 10); // 2022年03月30日 13:42:26
var timeSpan2 = nowDateTime - new TimeSpan(1, 10, 10); // 2022年03月30日 11:22:06
日時の大小を比較する
2つの日付を比較したい場合は、DateTime の CompareTo メソッドを使います。
比較する日時が前の日時であるか、同じ日時であるか、それとも後の日時であるかを戻り値で判断できます。
var dateTime1 = new DateTime(2022, 03, 30, 12, 32, 16);
var dateTime2 = new DateTime(2022, 04, 01, 12, 32, 16);
switch (dateTime1.CompareTo(dateTime2))
{
case -1:
Debug.WriteLine("dateTime1 は dateTime2 より前の日時です");
break;
case 0:
Debug.WriteLine("dateTime1 は dateTime2 は同じ日時です");
break;
case 1:
Debug.WriteLine("dateTime1 は dateTime2 より後の日時です");
break;
};
時刻は気にせず、日付だけを比較対象にしたい場合は、DateTimeのDateプロパティを使って日付データを取得して CompareTo を行います。以下のソースコードの3行目が変わります。
var dateTime1 = new DateTime(2022, 03, 30, 12, 32, 16);
var dateTime2 = new DateTime(2022, 03, 29, 12, 32, 16);
switch (dateTime1.Date.CompareTo(dateTime2.Date))
{
case -1:
Debug.WriteLine("dateTime1 は dateTime2 より前の日時です");
break;
case 0:
Debug.WriteLine("dateTime1 は dateTime2 は同じ日時です");
break;
case 1:
Debug.WriteLine("dateTime1 は dateTime2 より後の日時です");
break;
};
DateTimeのフォーマットの種類
DateTime を 文字列に変換する際、フォーマット(書式)を指定することで様々な形式の文字列に変換することが可能です。
var nowDateTime = DateTime.Now; // 2022年04月01日 12:32:16
//日付
var date1 = nowDateTime.ToString("d"); // 2022/04/01
var date2 = nowDateTime.ToString("D"); // 2022年04月01日
//年
var year1 = nowDateTime.ToString("yy"); // 22
var year2 = nowDateTime.ToString("yyyy"); // 2022
//月
var month1 = nowDateTime.ToString("M"); // 4
var month2 = nowDateTime.ToString("MM"); // 04
//日
var day1 = nowDateTime.ToString("d"); // 1
var day2 = nowDateTime.ToString("dd"); // 01
//時間
var hour1 = nowDateTime.ToString("hh"); // 12 (午前と午後は区別できない)
var hour2 = nowDateTime.ToString("HH"); // 12 (午前と午後は区別できる)
// 分
var minute = nowDateTime.ToString("mm"); // 32
//秒
var second = nowDateTime.ToString("ss"); // 16
//ミリ秒
var milliSec = nowDateTime.ToString("fff"); // 16
//曜日
culture = new CultureInfo("ja-JP");
var dayOfTheWeek1 = nowDateTime.ToString("ddd", culture); // 金
var dayOfTheWeek2 = nowDateTime.ToString("dddd", culture); // 金曜日
//日時
var full1 = nowDateTime.ToString("f"); // 2022年4月1日 12:32
var full2 = nowDateTime.ToString("F"); // 2022年4月1日 12:32:16
//時間
var time1 = nowDateTime.ToString("t"); // 12:32
var time2 = nowDateTime.ToString("T"); // 12:32:16
//午前or午後
var ampm = nowDateTime.ToString("tt"); // 午後
このように ToString メソッドのパラメーターに書式を文字列で渡すことで形式を変更することができます。
今回使用した書式を次の通りまとめていますので、参考にしてみてください。
書式指定子 | 名前 | 説明 | 出力例 |
---|---|---|---|
d | 短い形式の日付パターン | 年月日を出力する | 2022/04/01 |
D | 長い形式の日付パターン | 年月日をより詳細に出力する | 2022年04月01日 |
t | 短い形式の時刻パターン | 時・分を出力する | 12:32 |
T | 長い形式の時刻パターン | 時・分・秒を出力する | 12:32:16 |
f | 完全な日付と時刻のパターン (短い形式の時刻) | 年月日 と 時・分 を空白で 区切って組み合わせる | 2022年04月01日 12:32 |
F | 完全な日付と時刻のパターン (長い形式の時刻) | 年月日 と 時・分・秒 を 空白で区切って組み合わせる | 2022年04月01日 12:32:16 |
yy | ー | 年の下2桁 (00~99) | 22 |
yyyy | ー | 年の下4桁(0000~9999) | 2022 |
M | ー | 月 (1~12) | 4 |
MM | ー | 月 (01~12) | 04 |
d | ー | 日にち (1~31) | 1 |
dd | ー | 日にち (01~31) | 01 |
ddd | ー | 曜日の省略名 | 金 |
dddd | ー | 曜日の完全な名前 | 金曜日 |
tt | ― | 午前 or 午後 | 午後 |
hh | ー | 時間 (01~12) | 12 |
HH | ー | 時間 (00~23) | 12 |
mm | ー | 分 (0~59) | 32 |
ss | ー | 秒 (00~59) | 16 |
fff | ー | ミリ秒(000~999) | 000 |
まとめ
今回は DateTime 型を使って日時や日付を取得する方法やフォーマットの種類についていくつか代表的なものを紹介しました。
基本的な使い方は網羅しているつもりですので、DateTime 型を使う時に参考になれば幸いです。
以上、最後まで読んで頂きありがとうございました。