(前言:尽管这个问题一定是主观的,但它既不打算过于宽泛也不基于观点)。
我正在跟踪软件中的一个错误,该错误使用了dtValue.ToString( "U", CultureInfo.InvariantCulture )
而不是dtValue.ToString( "u", CultureInfo.InvariantCulture )
。
(我想这是因为"R"
和"r"
以及"O"
和"o"
在字母大小写上不同,.NET对待它们的方式相同,而{{1 }}和"U"
代表了截然不同的格式和行为。
解决此问题后,我查看了t he documentation for the U
format out of curiosity,并质疑它为什么首先存在,因为我无法想到"u"
的用例。
对于那些想知道的人:U
是这样做的:
U
值,那么总是会抛出一个DateTimeOffset
。FormatException
,则在内部使用DateTime
将其转换为UTC:
DateTime.ToUniversalTime
,则不进行任何转换。value.Kind == DateTimeKind.Utc
或value.Kind == DateTimeKind.Local
,则应用本地计算机的系统时区的当前UTC偏移量将其转换为UTC。Unspecified
格式("F"
)格式化该值。
DateTimeFormatInfo.FullDateTimePattern
使用InvariantCulture
。"dddd, dd MMMM yyyy HH:mm:ss"
使用en-US
。"dddd, MMMM d, yyyy h:mm:ss tt"
使用en-GB
。我的推理:
"dd MMMM yyyy HH:mm:ss"
,但是结果输出字符串具有冗余信息(日期名称)并且难以解析信息(英语全月名称),而机器可读格式始终使用以下形式ISO 8601的InvariantCulture
。yyyy-MM-dd HH:mm[:ss][zzz]
的情况下处理不同的DateTime
值(例如,使用DateTimeKind
值的程序就好像它代表了UTC,尤其是在本地计算机的时区为UTC时)或英国时间(因此您会在英国夏季时间遇到一些有趣的错误)。
DateTimeKind.Local
或在switch
上分支以明确转换为UTC,则可以使用dtValue.Kind
并避免使用F
的隐式UTC转换。U
格式为DateTimeKind.Unspecified
的值会引发异常,因为该值的偏移量是 unspecified -令人惊讶的是,U
使用本地计算机时区的当前值偏移量(与ToUniversalTime()
一样),而不是抱怨进行假设。 (不过,这就是为什么我们应该尽可能使用Local
或NodaTime的原因。)DateTimeOffset
根本不支持它(大概是为了让.NET程序员放弃使用它?)。我的问题:
“您是否曾经有意使用DateTimeOffset
格式说明符或在生产代码中使用过它?为什么?在当时是个好主意,还是一个不错的选择?”