如何使用 Dateformat ISO 8601 创建 .NET CultureInfo?

And*_*eas 6 c# datetime cultureinfo string-formatting

是否可以让 .NET 创建以下输出?

DateTime.UtcNow.ToString() --> "2017-11-07T00:40:00.123456Z"
Run Code Online (Sandbox Code Playgroud)

当然,总有可能使用 ToString("s") 或 ToString("yyyy-MM-ddTHH:mm:ss.fffffffK")。但是有没有办法将无参数 ToString-Method 的默认行为调整为所需的输出?

我尝试更改 CurrentCulture。但我得到的最好的是“2017-11-07 00:40:00.123456Z”。我没有找到将日期和时间之间的分隔符从空格更改为“T”的方法。

Mat*_*int 5

这是可能的,但只能通过反射访问内部字段,这不能保证在所有情况下都有效。

var culture = (CultureInfo) CultureInfo.InvariantCulture.Clone();
var field = typeof(DateTimeFormatInfo).GetField("generalLongTimePattern",
                                           BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
    // we found the internal field, set it
    field.SetValue(culture.DateTimeFormat, "yyyy-MM-dd'T'HH:mm:ss.FFFFFFFK");
}
else
{
    // fallback to setting the separate date and time patterns
    culture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
    culture.DateTimeFormat.LongTimePattern = "HH:mm:ss.FFFFFFFK";
}
CultureInfo.CurrentCulture = culture;

Console.WriteLine(DateTime.UtcNow);  // "2017-11-07T00:53:36.6922843Z"
Run Code Online (Sandbox Code Playgroud)

请注意,ISO 8601 规范确实允许使用空格而不是T. 这只是最好使用T