获取独立于 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
实现。
这似乎很简单,但我认为提供一个优雅的解决方案很棘手。
需要将 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
实现。