获取独立于 CultureInfo.Calendar 的日期时间

Get DateTime independent from CultureInfo.Calendar

这似乎很简单,但我认为提供一个优雅的解决方案很棘手。

需要将 UTC 日期时间作为字符串获取 - 但独立于 CultureInfo 设置。以一种性能良好的方式 - 因为它每分钟需要几次。

所以如果Thread.CurrentThread.CurrentCulture 设置为泰语,它将打印 2020-10-08 而不是 2565-10-08.

如上所述,我正在寻找一种不需要来回更改 Thread.CurrentThread.CurrentCulture 的轻量级解决方案。

我试图在下面的单元测试代码中解决这个问题。除其他外,这目前打印

Arabic returns 1442-02-21T13:03:28.0393847Z

Thai returns 2563-10-08T13:03:28.3558814Z

public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
        StringBuilder assertionErrors = new StringBuilder();

        // each culture info shall return e.g. 2020-10-08
        var expected = $"{ DateTime.Now.Year}-{ DateTime.Now.Month.ToString().PadLeft(2, '0') }-{ DateTime.Now.Day.ToString().PadLeft(2, '0')}";

        foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
        {                
            // ARRANGE
            Thread.CurrentThread.CurrentCulture = ci;

            // ACT
            string originalTime = GetEventTime();

            // ASSERT
            if (!originalTime.StartsWith(expected))
            {
                // Append error
                assertionErrors.AppendLine($"{ ci.EnglishName } returns {originalTime}");
            }
        }

        var result = assertionErrors.ToString();

        Assert.AreEqual(0, result.Length, result);
    }

    private string GetEventTime()
    {
        return DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffffffK");
    }
}

只需将 CultureInfo.InvariantCulture 传递到 ToString 调用中:

private string GetEventTime() =>
    DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffffffK", CultureInfo.InvariantCulture);

一般来说,culture-specific 格式化调用通常有重载接受 IFormatProvider - CultureInfo 实现。