🦓 C# 学習4日目 時間計算 ~DateTime型とTimeSpan型を理解する~
作成日: 2023/01/10
0

C# 学習4日目 時間計算 ~DateTime型とTimeSpan型の理解~

昨日の「本日の残り時間時計」は、
早く完成させたいばかりに、TimeSpan型の理解が足りないまま進めて、結果、苦労しました。
TimeSpan型を出すためにはTimeSpan型で計算するのだと勘違いしていました。
DateTime型とTimeSpan型の違いをよく把握していませんでした。
でも、初心者なりに調べたら、おそらくこうだろうという
シンプルな考えにたどり着きました。

DateTime型

1時30分

TimeSpan型

1時間30分

すなわち

1時30分と1時間30分は違う
TimeSpan型は 時間の間隔(何時間か) という事
お恥ずかしなら、こんな事、今日気づきました。

以上、踏まえたうえで 今日の残り時間を求めるには

昨日のソースコードでは、今日は無理やり今年の1月1日という事にしておいて計算しました。

今日の24時 - 現在時刻 = 今日の残り時間

計算には、「今日の24時」=「明日の0:00」という日時が必要になり、
1月1日にしたのは、もし今日の日時が月末だった場合や大晦日だった場合、
今日の日時が月末や大晦日であるかどうかを判別し、翌日を出すには
月や年を1足さなければいけないのがめんどくさかったからです。

ですが、結局、そのための、月末処理や、年末処理はいりませんでした
以下は、そこに到達するまでの検証コードです。

using System;

/**
 * 本日の残り時間計算の理解を深めるサンプル
 * */
class TodayTest
{
    public static void Main()
    {
        // DateTime型の理解を深める  //

        // 現在時刻を取得する
        DateTime dt = DateTime.Now;
        Console.WriteLine("現在の日時時刻:" + dt);
        Console.WriteLine("現在の時刻:" + dt.ToLongTimeString());

        // 年、月、日、時、分、秒、ミリ秒をそれぞれ取り出す //
        // 年はYearプロパティにて取得
        Console.WriteLine("年:" + dt.Year);
        // 月はMonthプロパティにて取得
        Console.WriteLine("月:" + dt.Month);
        // 日はDayプロパティにて取得
        Console.WriteLine("日:" + dt.Day);
        // 時はHourプロパティにて取得
        Console.WriteLine("時:" + dt.Hour);
        // 分はMinuteプロパティにて取得
        Console.WriteLine("分:" + dt.Minute);
        // 秒はSecondプロパティにて取得
        Console.WriteLine("秒:" + dt.Second);
        // ミリ秒はMillisecondプロパティにて取得
        Console.WriteLine("ミリ秒:" + dt.Millisecond);

        // その月は何日ある?=今月の末日 DaysInMontメソッドにて取得
        Console.WriteLine("今月の末日:" + DateTime.DaysInMonth(dt.Year, dt.Month));

        // 月末の月次処理を入れる//
        // 今日は月末かどうか? 今日のDayプロパティとDaysInMonthメソッドの取得値を比較
        if (dt.Day == DateTime.DaysInMonth(dt.Year, dt.Month))
        {
            //月末の処理
            Console.WriteLine("今日は月末です");
        }
        else
        {   //月末でない処理
            Console.WriteLine("今日は月末ではありません");
        }

        //今日の日時を取得する(時刻は0:00:00)
        // 年月日のみでDateTime型 インスタンス生成
        DateTime the_day = new DateTime(dt.Year, dt.Month, dt.Day);
        Console.WriteLine("今日の(始まりの)日付を取得:" + the_day);

        //明日の日時を取得する(時刻は0:00:00)

        Console.WriteLine("明日の(始まりの)日付を取得:" + the_day.AddDays(1));

        // 月末に一日追加の検証
        // 月末検証の日付を作る
        DateTime the_last_day = new DateTime(dt.Year, dt.Month, DateTime.DaysInMonth(dt.Year, dt.Month));
        Console.WriteLine("今月の最後の日です:" + the_last_day);
        // 末日の1日後AddDay(1)が翌月の1日であるか検証する
        DateTime the_tomorrow_day = the_last_day.AddDays(1);
        Console.WriteLine("今月の最後の日の1日後の取得:" + the_tomorrow_day);
        // 正しい結果が得られれば、すなわち
        Console.WriteLine("検証結果:AddDays(1)を使えば、月末も翌日の日付を得るために特別な処理はいらない");

        // 以上を踏まえて、明日の午前0時ちょうど(つまり今日の24時ちょうど)から現在時刻を引いて、今日の残り時間を出すには

        TimeSpan remaining_today_time = the_tomorrow_day.Subtract(dt); // Add() 足す 、Subtract() 引く 
        Console.WriteLine("今日の残り時間:{0:hh\\:mm\\:ss} ", remaining_today_time);
    }
}

実行結果

現在の日時時刻:2023/01/10 22:47:00
現在の時刻:22:47:00
年:2023
月:1
日:10
時:22
分:47
秒:0
ミリ秒:316
今月の末日:31
今日は月末ではありません
今日の(始まりの)日付を取得:2023/01/10 0:00:00
明日の(始まりの)日付を取得:2023/01/11 0:00:00
今月の最後の日です:2023/01/31 0:00:00
今月の最後の日の1日後の取得:2023/02/01 0:00:00
検証結果:AddDays(1)を使えば、月末に翌日の日付を得るための特別な処理はいらない
今日の残り時間:01:12:59

検証結果

今日の終わりの日時、すなわち、翌日の00:00:00の日時を取得するには、
AddDays(1)
を使えばよい。

明日の0時.Subtract(現在時刻)
で、今日の残り時間が取れる・・・

以上、初心者の私が、時間計算の理解をするのに時間がかかった話 でした


これからゲームアプリとWindowsアプリを作りたい初心者です。 ゲームアプリとWindowsアプリ、共に経験ゼロです。 これからの体験が少しでも参考になれば幸いです。 目指す事 ・C言語学習→C#学習 ・Unity (C#) の勉強 ・Unityゲーム作成 ・Windowsアプリ(C#) 作成