C#での日付の扱い方をまとめます。
DateTime型の基本的な使い方から、和暦の表示などプログラムを書く上で頻繁に使うことになると思います。
【検証環境】.NET Framework 4.7.2
DateTime型
プロパティ
/////DateTimeオブジェクトの生成
//年月日の指定
var dt1 = new DateTime(2021, 03, 20); // 2021/03/20 0:00:00
//年月日時分秒の指定
var dt2 = new DateTime(2021, 03, 20, 8, 20, 30); // 2021/03/20 8:20:30
/////DateTimeのプロパティ
//Today (日付を返すが、時刻は含まない)
DateTime today = DateTime.Today; //2021/03/20 0:00:00
//Now(時刻を含めた日時を返す)
DateTime now = DateTime.Now; //2021/03/20 13:44:55
//年
int year = now.Year; //2021
//月
int month = now.Month; //3
//日
int day = now.Day; //20
//時間
int hour = now.Hour; //13
//分
int minute = now.Minute; //44
//秒
int second = now.Second; //55
//ミリ秒
int millisecond = now.Millisecond; //756
//曜日 (DayOfWeek型で返す)
DayOfWeek dayOfWeek = now.DayOfWeek; //DayOfWeek.Saturday
//うるう年の判定
bool isLeapYear = DateTime.IsLeapYear(now.Year); //false
//1月1日から何日目か
int DayOfYear = now.DayOfYear; //79
Parse / TryParse (string型からDateTime型への変換)
Parseだと変換できない場合、例外エラーが発生してしまいます。
Tryparseを使うことで、変換に失敗した場合の処理を考慮するようにしましょう。
DateTime dtParse = DateTime.Parse("2021/3/20");
//変換に成功すればtrue、失敗すればfalseを返す
//変換に成功すれば、outで指定した変数に日付が入る
bool tryParse = DateTime.TryParse("2021/03/20", out DateTime dt);
//和暦文字列からでも変換可能
bool tryParseWareki = DateTime.TryParse("令和3年3月20日", out dt);
ParseExact (文字列のフォーマットを指定してDateTime型へ変換)
Parseでは変換できない文字列の場合は、ParseExact を使うことでDateTime型に変換することができます。
例えば、年月日「20211010」や年月日時分秒「20211010112233」などの文字列を日付に変換する場合に使います。※これらの文字列に通常のParseを使うとエラーになります。
第1引数 | 第2引数 | 第3引数 |
---|---|---|
対象文字文字列 | フォーマット | null |
var dateString1 = "20211010";
var dateString2 = "20211010112233";
//DateTime.Parseだとエラーになる
//var date1 = DateTime.Parse(dateString1);
//var date2 = DateTime.Parse(dateString2);
//年月日
var date = DateTime.ParseExact(dateString1, "yyyyMMdd", null);
Console.WriteLine(date); //2021/10/10 0:00:00
//年月日時分秒
date = DateTime.ParseExact(dateString2, "yyyyMMddhhmmss", null);
Console.WriteLine(date); //2021/10/10 11:22:33
日付のフォーマット
Tostringメソッドを使うことで、DateTimeオブジェクトを様々な形式の文字列に変換可能です。
var now = new DateTime(2021, 3, 1, 15, 5, 9); //2021/3/1 15:30:33
//日付
string date1 = now.ToString("d"); //2021/03/01
string date2 = now.ToString("D"); //2021年3月1日
//年
string year = now.ToString("yyyy"); //2021
//月
string month1 = now.ToString("MM"); //03
string month2 = now.ToString("M"); //3
//日
string day1 = now.ToString("dd"); //01
string day2 = now.ToString("d"); //1
//曜日
string dayOfTheWeek1 = now.ToString("ddd"); //月
string dayOfTheWeek2 = now.ToString("dddd"); //月曜日
//日時
string full1 = now.ToString("f"); //2021年3月1日 15:05
string full2 = now.ToString("F"); //2021年3月1日 15:05:09
//時間
string time1 = now.ToString("t"); //15:05
string time2 = now.ToString("T"); //15:05:09
//午前or午後
string ampm = now.ToString("tt"); //午後
//時間(12時間制)
string hour12 = now.ToString("hh"); //03
//時間(24時間制)
string hour24 = now.ToString("HH"); //15
//分
string minute1 = now.ToString("mm"); //05
//秒
string second = now.ToString("ss"); //09
和暦で表示
和暦を表示するには、CultureInfo型 と JapaneseCalender型を使用します。
using System.Globalization;
CultureInfo culture = new CultureInfo("ja-JP");
// DateTime構造体を和暦の文字列に変換する
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
var warekiDate = DateTime.Now.ToString("ggyy年MM月dd日", culture); //令和03年03月20日
日時の計算
var now = new DateTime(2021, 3, 1, 15, 0, 0); //2021/03/01 15:00:00
//TimeSpan型を使用
//時/分/秒を初期化したものを足す
var timeSpan = now + new TimeSpan(1, 30, 50); //2021/03/01 16:30:50
//日付の加減算
var addDays1 = now.AddDays(1); //2021/03/02 15:00:00
var addDays2 = now.AddDays(-1); //2021/02/28 15:00:00
//※注意点
//nowを変更したい場合は、now = now.AddDays(1); のように使う。
//時の加減算
var addHours1 = now.AddHours(1); //2021/03/01 16:00:00
var addHours2 = now.AddHours(-1); //2021/03/01 14:00:00
//年の加減算
var addYear1 = now.AddYears(1); //2022/03/01 15:00:00
var addYear2 = now.AddYears(-1); //2020/03/01 15:00:00
//月の加減算
var addMonth1 = now.AddMonths(1); //2021/04/01 15:00:00
var addMonth2 = now.AddMonths(-1); //2021/02/01 15:00:00
//分の加減算
var addMinute1 = now.AddMinutes(1); //2021/03/01 15:01:00
var addMinute2 = now.AddMinutes(-1); //2021/03/01 14:59:00
//秒の加減算
var addSecond1 = now.AddSeconds(1); //2021/03/01 15:00:01
var addSecond2 = now.AddSeconds(-1); //2021/03/01 14:59:59
//引数はdouble型なので、少数単位でも指定可能
//1.5日後を求める
var add = now.AddDays(1.5); //2021/03/03 3:00:00
//月末日を求める
var nextMonth = now.AddMonths(1); //2021/04/01 15:00:00
var endOfMonth = new DateTime(nextMonth.Year, nextMonth.Month, 1).AddDays(-1); //2021/03/31 00:00:00