やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#で日時文字列を出力するコンソールアプリを作った

C#で日時文字列を標準出力するコンソールアプリを作った。

成果物

GitHub MEGA

開発環境

プロジェクト

プロジェクト 概要
GetTimestamp ツール本体。
GetTimestampFormatExample おまけツール。フォーマットのパターンを出力する。
GetTimestampTest NUnitによる単体試験。

GetTimestamp

使い方

実行コマンド例 出力例
GetTimestamp.exe 20161220102139578
GetTimestamp.exe "ggyyyy年M月d日 H時m分s秒" ja-JP System.Globalization.JapaneseCalendar 平成28年12月20日 10時21分49秒
Timestamp.exe F 2016年12月20日(火) 10:22:29
GetTimestamp.exe "yyyy-MM-dd HH:mm:ss.ffffff" 2016-12-20 10:23:15.859375
GetTimestamp.exe dddd 火曜日

ヘルプ

実行コマンド例 説明
GetTimestamp.exe --help ヘルプを表示する。
GetTimestamp.exe --listup-cultures Culture一覧を表示する。第二引数の候補
GetTimestamp.exe --listup-calendars Calendar一覧を表示する。第三引数の候補
GetTimestamp.exe --listup-calendars ja-JP ja-JPにおけるCalendar一覧を表示する。第三引数の候補

Format

デフォルトのフォーマットはyyyyMMddHHmmssfffである。 しかし、第一引数に書式指定文字列を渡すことで任意の書式で出力できる。 詳しくは以下URL参照。

Culture, Calendar

和暦など、その国固有の年号表記などができる。 第二、第三引数に渡す。 和暦を表示する場合、GetTimestamp.exe "ggyyyy年M月d日 H時m分s秒" ja-JP System.Globalization.JapaneseCalendarのようにする。和暦しか確かめていない。

GetTimestampFormatExample

使い方

GetTimestampFormatExample.exeを実行するだけ。

出力結果

以下のファイルが出力される。

ファイル 概要
StandardPattern.md 標準の日時書式指定文字列パターン。
CustomPattern.md カスタム日時書式指定文字列パターン。
OptionalCalendarsFormat.html 書式Fを各CultureのOptionalCalendarsごとに出力する。
Help.txt ヘルプ
Cultures.txt カルチャー一覧
Calendars.txt カレンダー一覧
CalendarJP.txt ja-JPのカレンダー一覧

注意

  • すべて完了するのに10分近くかかるかもしれない
  • GetTimestampFormatExample.exeファイルのパスから../../../GetTimestamp\bin\Release\にあるGetTimestamp.exeを参照して実行する。パスとファイル名前はそのままにすべし。

MEGAGetTimestampFormatExample\bin\Release配下に出力結果ファイルを入れておいた。

GetTimestampTest

単体試験プロジェクト。コマンドパラメータの確認をしている。

手抜きなところがある。

コードが汚い

CommandRouter.cs

コマンド引数の体系が変わるとコードもごっそり変えねばならない。かといって引数解析ライブラリなどを使うのも大げさすぎる。小さいプログラムなので今のままでいいと思うことにしている。

各種コマンド

GetTimestamp.Command名前空間にある各種コマンドに重複するコード部分がある。大した量でないから各クラスバラバラに書いている。

単体テストが少ない

エラーの場合などをテストしていない。

正常パターンが出力されているっぽいからいいか、という感じ。

エラー処理に注意を払っていない

存在しないCulture(引数2)

存在しないCultureを第二引数に指定するとわかりづらい表示になる。

GetTimestamp --listup-calendars a
シーケンスに要素が含まれていません
   場所 System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
   場所 GetTimestamp.Command.TargetCalendarCommand.Execute() 場所 C:\root\pj\Do\cs\GetTimestamp201612110815\GetTimestamp\Command\TargetCalendarCommand.cs:行 15

「存在しないカルチャ名です。ja-JPなど存在するカルチャ名を指定してください。"GetTimestamp.exe --listup-cultures"を実行することでカルチャ名一覧を出力できます。」というようにするほうが親切。

存在しないCulture(引数3)

GetTimestamp a b c
カルチャはサポートされていません。
パラメーター名: name
b は無効なカルチャ識別子です。
   場所 System.Globalization.CultureInfo..ctor(String name, Boolean useUserOverride)
   場所 GetTimestamp.Command.LocaleFormatCommand.GetCulture() 場所 C:\root\pj\Do\cs\GetTimestamp201612110815\GetTimestamp\Command\LocaleFormatCommand.cs:行 28
   場所 GetTimestamp.Command.LocaleFormatCommand.Execute() 場所 C:\root\pj\Do\cs\GetTimestamp201612110815\GetTimestamp\Command\LocaleFormatCommand.cs:行 14

存在しないCultureで出力しようとした結果。わりとわかりやすいが、GetTimestamp --listup-calendars aのときと同じ理由で生じるエラーなのに、表示されるエラーの表現が違うのがわかりにくい。開発者向けでなくユーザ向けのエラー表現にすべき。

不正な日時書式指定文字列

GetTimestamp a
入力文字列の形式が正しくありません。
   場所 System.DateTimeFormat.GetRealFormat(String format, DateTimeFormatInfo dtfi)
   場所 System.DateTimeFormat.ExpandPredefinedFormat(String format, DateTime& dateTime, DateTimeFormatInfo& dtfi, TimeSpan& offset)
   場所 System.DateTimeFormat.Format(DateTime dateTime, String format, DateTimeFormatInfo dtfi, TimeSpan offset)
   場所 System.DateTimeFormat.Format(DateTime dateTime, String format, DateTimeFormatInfo dtfi)
   場所 GetTimestamp.Command.FormatCommand.Execute() 場所 C:\root\pj\Do\cs\GetTimestamp201612110815\GetTimestamp\Command\FormatCommand.cs:行 14

たとえば以下のようなエラーのほうがわかりやすい。

「日時書式指定文字列が不正です。"yyyy-MM-dd HH:mm:ss.ffffff"のように指定してください。詳細は以下URLを参照。

https://msdn.microsoft.com/ja-jp/library/az4se3k1(v=vs.110).aspx)
https://msdn.microsoft.com/ja-jp/library/8kb3ddd4(v=vs.110).aspx)

所感

久しぶりにC#を書けて楽しかった。