🦓
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#) 作成