転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

【技術書メモ】C#プログラミングのイディオム / 定石&パターン⑧

今回は、日付、時刻の操作方法。

DateTime構造体

DateTime構造体のインスタンス生成の主な方法と、よく使われるTodayプロパティとNowプロパティ。

// インスタンス生成
var dt1 = new DateTime(2016, 2, 15);
var dt2 = new DateTime(2016, 2, 15, 8, 45, 20);

// TodayとNowプロパティ
var today = DateTime.Today;
var now = DateTime.Now;


また、DateTime構造体には、年、月、日など、様々な日付および時刻の情報を、プロパティから参照することができる。
※ここでは割愛。


指定した日付の曜日の求め方。

var today = DateTime.Today;
DayOfWeek dayOfWeek = today.DayOfWeek;
if(dayOfWeek == DayOfWeek.Sunday)

// DayOfWeekプロパティの型はDayOfWeek列挙型
public enum DayOfWeek {
    Sunday = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6


DayTime構造体を使用すれば、閏年の判定も可能。

var isLeapYear = DateTime.IsLeapYear(2016);


日付形式のもう字列をDateTimeオブジェクトに変換する方法。

DateTime dt1;
if(DateTime.TryParse("2017/6/21", out dt1))
    // 2017/06/21 0:00:00
    Console.WriteLine(dt1);
DateTime dt2;
if(DateTime.TryParse("2017/6/21 10:41:38", out dt2))
    // 2017/06/21 10:41:38
    Console.WriteLine(dt2);

日時のフォーマット

日時を文字列に変換するには、ToStringメソッドを使用する。
ToStringの引数に、あらゆる書式を指定すると、結果の値も変わってくる。

var date = new DateTime(2016, 4, 7, 21, 6, 47);
var s1 = date.ToString("d"); // 2016/04/07


日付を和暦で表示するには、DateTimeクラスを使用する。

var date = new DateTime(2016, 8, 15);
var culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
var str = date.ToString("ggyy年M月d日", culture);


指定した日付の元号を得るには、DateTimeFormatInfoクラスのGetEraNameメソッドを使用する。

var date = new DateTime(1995, 8, 24);
var culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
// 元号コードの取得
var era = culture.DateTimeFormat.Calendar.GetEra(date);
// 元号コードから元号名を得る
var eraName = culture.DateTimeFormat.GetEraName(era);


指定した日付の曜日を得るには、DateTimeFormatInfoクラスのGetDayNameメソッドを使用する。

var date = new DateTime(1998, 6, 25);
var culture = new CultureInfo("ja-JP");
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
// 曜日の取得
var dayOfWeek = culture.DateTimeFormat.GetDayName(date.DayOfWeek);

DateTimeの比較

日時を比較するには、比較演算子をそのまま利用できる。

var dt1 = new DateTime(2006, 10, 18, 1, 30, 21);
var dt2 = new DateTime(2006, 11, 2, 18, 5, 28);
if (dt1 < dt2)
else if (dt1 == dt2)


時刻情報を含まない日付だけを比較する場合は、Dateプロパティを使う。

var dt1 = new DateTime(2001, 10, 25, 1, 30, 21);
var dt2 = new DateTime(2001, 10, 25, 18, 5, 28);
if (dt1.Date < dt2.Date)
else if (dt1.Date == dt2.Date)

日時の計算

指定した時分秒後を求めるには、TimeSpan構造体を使用する。

var now = DateTime.Now;
// TimeSpanオブジェクトを加える
var future = now + now TimeSpan(1, 30, 0);


n日後、n日前の日付を求めるには、AddYears、AddMonthsメソッドを利用する。

var date = new DateTime(2009, 10, 22);
var future = date.AddYears(2).AddMonths(5);


2つの日時の差を求める。

var date1 = new DateTime(2009, 10, 22, 1, 30, 20);
var date2 = new DateTime(2009, 10, 22, 2, 40, 56);
TimeSpan diff = date2 - date1;
Console.WriteLine("差は、{0}日間{1}時間{2}分{3}秒です", diff.Days, diff.Hours, diff.Minutes, diff.Seconds);
Console.WriteLine("トータルで{0}秒です", diff.TotalSeconds);


2つの日付の日数差を求める。

var date1 = new DateTime(2009, 10, 22, 1, 30, 20);
var date2 = new DateTime(2009, 10, 22, 2, 40, 56);
TimeSpan diff = date2.Date - date1.Date;
Console.WriteLine("{0}日間", diff.Days);


DaysInMonth静的メソッドを使えば、月末日を求めれる。

var today = DateTime.Today;
int day = DateTime.DaysInMonth(today.Year, today.Month);
var endOfMonth = new DateTime(today.Year, today.Month, day);


DayOfYearプロパティを使って、1月1日からの通算日を求める。

var today = DateTime.Today;
int dayOfYear = today.DayOfYear;