这似乎很容易,但我认为提供优雅的解决方案很棘手。
需要将 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)
只是传递CultureInfo.InvariantCulture到ToString呼叫:
private string GetEventTime() =>
DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffffffK", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
通常,特定于文化的格式化调用通常具有接受IFormatProvider-CultureInfo实现的重载。
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |