【C#】DateTime.Nowに曜日が入ってしまう【現場の備忘録】

プログラム

先日、こんな連絡が来た。

「昨日まで問題なかったのに急に出力したcsvに曜日が追記されるようになっちゃって、申請サイトにUP出来なくなちゃったんだけど…」

問題のcsvを送ってもらい確認してみると本来

yyyy/MM/dd hh:mm:ss //(2024/10/01 12:00:00)

となるべきところが

yyyy/MM/dd dddd hh:mm:ss //(2024/10/01 火曜日 12:00:00)

と表示されている。

ソースコードを確認してみると該当のデータは DateTime.Now; で取得していることが分かった。

ただ操作手順を聞き取ってその通りに操作しても自分のローカル環境では、正常にyyyy/MM/dd hh:mm:ss形式で出力される

ローカル環境では問題なく動くことを伝え、昨日から今日にかけてOSの更新か設定を変更していないか聞いたところタスクバーの日付設定を変更していた。

現象の再現

最初にテスト用として Visual studio 2022 で新しいコンソールアプリのプロジェクトを .Net8 で作成し、日付設定を変更せずに以下を実行する。
ちなみにOSはWindows11

記載処理はシンプルに以下の一行だけ。

Console.WriteLine(DateTime.Now);

結果:

当然、何もいじっていなければyyyy/MM/dd hh:mm:ssの形式で表示される。

実際に聞き取った通りにタスクバーの日付を変更してみる。

「スタート」ボタン→「設定」→「時刻と言語」→「その他の時計」の順で押下。

そうすると「日付と時刻」の設定画面が表示される。

この設定画面の一番右のタブ「日付と時刻」を押下。

さらに「日付と時刻の変更」→「カレンダーの設定の変更」→「追加の設定」と押下していくと「形式のカスタマイズ」という設定画面が表示される。

「形式のカスタマイズ」の「日付」タブの「短い形式」欄を編集。

yyyy/MM/dd → yyyy/MM/dd dddd

「適用」を押下するとタスクバーの日付の横に曜日が表示されるようになるはず。

この状態で最初の処理を実行すると

曜日が追加される。

解決方法

プロジェクトの起動時に日付の形式指定処理を実行するようにすれば良い。

一度実行すれば以降のDateTimeのデフォルトは指定した形式になる。

// 日付設定がOSに依存しないように設定
// カスタムCultureInfoの作成
CultureInfo customCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();

// 日付と時刻の書式設定を変更
customCulture.DateTimeFormat.ShortDatePattern = "yyyy/MM/dd";  // 短い日付形式
customCulture.DateTimeFormat.LongDatePattern = "yyyy年MM月dd日"; // 長い日付形式
customCulture.DateTimeFormat.ShortTimePattern = "HH:mm";  // 短い時刻形式
customCulture.DateTimeFormat.LongTimePattern = "HH:mm:ss"; // 長い時刻形式

// アプリケーション全体に適用
Thread.CurrentThread.CurrentCulture = customCulture;
Thread.CurrentThread.CurrentUICulture = customCulture;

まぁ日付の設定をもとに戻してもらうのが既存処理の更新をせずに済むので一番手っ取り早いです。

そもそも .ToString(“yyyy/MM/dd hh:mm:ss”) で形式を指定しとけよ、という話でもある。

でも既存アプリの改修で DateTime.Now; を多用していて一つ一つ処理を確認しながら形式指定を追加するのは面倒。

その場合はログイン画面の起動時などに上記の設定を追記するだけで対策できます。

コメント

タイトルとURLをコピーしました