C#で日時文字列を標準出力するコンソールアプリを作った。
成果物
開発環境
- Windows XP SP3
- Visual C# 2010 Express
- .NET Framework 4.0
- Windows Console Application
- NUnit 2.6
プロジェクト
プロジェクト | 概要 |
---|---|
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を参照して実行する。パスとファイル名前はそのままにすべし。
のGetTimestampFormatExample\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#を書けて楽しかった。