获取独立于 CultureInfo.Calendar 的 DateTime

cle*_*soe 1 c# cultureinfo

这似乎很容易,但我认为提供优雅的解决方案很棘手。

需要将 UTC 日期时间作为字符串获取 - 但独立于 CultureInfo 设置。在某种程度上具有良好的性能 - 因为它每分钟需要几次。

因此,如果例如 Thread.CurrentThread.CurrentCulture 设置为 Thai,它将打印2020 -10-08 而不是2565 -10-08。

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

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

阿拉伯语返回 1442-02-21T13:03:28.0393847Z

泰国返回 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

只是传递CultureInfo.InvariantCultureToString呼叫:

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

通常,特定于文化的格式化调用通常具有接受IFormatProvider-CultureInfo实现的重载。