投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/5/27 14:55:54
> 拡張メソッドも、もっと簡潔に書ける方法があれば、教えてください。
VB2015 以降であればこう書けます。
ついでに、小数点以下 7 桁まで指定してみました。

<System.Runtime.CompilerServices.Extension()> _
Public Function ToStringリテラル(dt As DateTime, Optional IsDayOnly As Boolean = FalseAs String
    Dim fmt As System.IFormattable = $"#{dt:MM/dd/yyyy HH:mm:ss.fffffff}#"
    If IsDayOnly Then fmt = $"#{dt:MM/dd/yyyy}#"
    Return fmt.ToString(Nothing, System.Globalization.CultureInfo.InvariantCulture)
End Function


上記では、OS の地域設定が和暦モードになっていた場合のことを考え、
念のために IFormattable.ToString でインバリアント カルチャーを明示しています。

地域設定がスレッドカルチャ依存で良いなら、さらに短く書けます。
Return If(IsDayOnly, $"#{dt:MM\/dd\/yyyy}#", $"#{dt:MM\/dd\/yyyy HH\:mm\:ss\.fffffff}#")

スレッドのカルチャーを切り替える方法は、下記をご覧ください。
http://smdn.jp/programming/netfx/locale/0_abstract/


なお、$ で始まる文字列構文は VB2015 以降でしか使えませんが、
VB2013 以下でも、前回のサンプルに書いたように、
String.Format メソッド または DateTime の ToString メソッドで同じことができます。


おまけで、処理系ごとの日付型の精度について。

[.NET Framework] DateTime / 8 バイト
 100 ナノ秒精度
 西暦0001年01月01日 00:00:00.0000000~西暦9999年12月31日 23:59:59.9999999
[OLE] Date Variant / 8 バイト
 1 秒精度 (秒未満も保持できるが精度は保証されない)
 西暦100年01月01日 00:00:00~西暦9999年12月31日 23:59:59
[SQL Server] SmallDateTime / 4 バイト
 1 分精度 (29.999 秒以上切り上げ、29.998 秒以下切り捨てで丸められる)
 西暦1900年01月01日 00:00~西暦2079年06月06日 23:59
[SQL Server] datetime / 8 バイト
 1/300 ミリ秒精度 (秒未満は小数点以下 3 桁で、.xx0/.xx3/.xx7 に丸められる)
 西暦1753年01月01日 00:00:00.000~西暦9999年12月31日 23:59:59.997
[SQL Server] datetime2(0~7) / 6~8 バイト
 1 秒精度~100 ナノ秒精度
 西暦0001年01月01日 00:00:00.0000000~西暦9999年12月31日 23:59:59.9999999
[Oracle] DATE / 7 バイト
 1 秒精度
 紀元前4712年01月01日 00:00:00~西暦9999年12月31日 23:59:59
[Oracle] TIMESTAMP(0~9) / 7~11 バイト
 1 秒精度~1 ナノ秒精度
 紀元前4712年01月01日 00:00:00~西暦9999年12月31日 23:59:59
[MySQL 5.6.4 以降] DATE / 3 バイト
 1 日精度
 西暦1000年01月01日~西暦9999年12月31日
[MySQL 5.6.4 以降] DATETIME / 5~8 バイト
 1 秒精度~1 マイクロ秒精度 / 月や日部に 00 を許容
 西暦1000年01月01日 00:00:00.000000~西暦9999年12月31日 23:59:59.999999
[PostgreSQL] date / 4 バイト
 1 日精度
 4713 BC~5874897 AD
[PostgreSQL] timestamp(0~6) / 8 バイト
 1 秒精度~1 マイクロ秒精度
 4713 BC~294276 AD (紀元前4714年11月23日 23:59:59~西暦294277年01月09日 04:00:55)
[ファイルシステム] 作成日時
 NTFS : 100 ナノ秒精度 / UTC
 ReFS : 100 ナノ秒精度 / UTC
 FAT  : 10 秒精度 / ローカルタイム
 FAT32: 10 秒精度 / ローカルタイム
 exFAT: 10 ミリ秒精度 / ローカルタイム または UTC(Vista SP2 以降)
[ファイルシステム] 更新日時
 NTFS : 100 ナノ秒精度 / UTC
 ReFS : 100 ナノ秒精度 / UTC
 FAT  : 2 秒精度 / ローカルタイム
 FAT32: 2 秒精度 / ローカルタイム
 exFAT: 10 ミリ秒精度 / ローカルタイム または UTC(Vista SP2 以降)
[ファイルシステム] アクセス日時
 NTFS : 100 ナノ秒精度 / UTC
 ReFS : 100 ナノ秒精度 / UTC
 FAT  : 1 日精度 / ローカルタイム
 FAT32: 1 日精度 / ローカルタイム
 exFAT: 2 秒精度 / ローカルタイム または UTC(Vista SP2 以降)