C# 本地特定时间单元测试失败

C# 本地特定时间单元测试失败,c#,.net-core,xunit.net,datetimeoffset,C#,.net Core,Xunit.net,Datetimeoffset,我正在开发一个dot net core 2.2控制台应用程序,用于将.csv文件转换为.xml文件 我有一个单元测试来测试特定xml文件名的创建。文件名的一部分是时间。此时间段应始终为本地时间。 将DotnetCore2.2与xUnit一起使用 测试在本地成功(荷兰,文化nl nl),但在Azure中使用托管代理进行测试时失败。此托管代理托管在美国的某个地方(美国文化) 为了修复此测试,我在特定区域性中创建了特定的运行范围。 我假设DateTimeOffset的.LocalTime为我提供了特定

我正在开发一个dot net core 2.2控制台应用程序,用于将.csv文件转换为.xml文件

我有一个单元测试来测试特定xml文件名的创建。文件名的一部分是时间。此时间段应始终为本地时间。 将DotnetCore2.2与xUnit一起使用

测试在本地成功(荷兰,文化nl nl),但在Azure中使用托管代理进行测试时失败。此托管代理托管在美国的某个地方(美国文化)

为了修复此测试,我在特定区域性中创建了特定的运行范围。 我假设DateTimeOffset的.LocalTime为我提供了特定于区域性的本地时间,但当我在VS2019中调试它时,它将保留在nl nl中

为什么?

以下是一些代码部分(为了更好地阅读,删除了一些代码):

以及CurrentCultureScope类:

public class CurrentCultureScope : IDisposable
    {
        private readonly CultureInfo _culture;
        private readonly CultureInfo _uiCulture;

        private bool _disposed = false;

        public CurrentCultureScope(string name)
        {
            _culture = Thread.CurrentThread.CurrentCulture;
            _uiCulture = Thread.CurrentThread.CurrentUICulture;

            Thread.CurrentThread.CurrentCulture = new CultureInfo(name);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(name);
        }

        public void Dispose()
        {
            Dispose(true);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    Thread.CurrentThread.CurrentCulture = _culture;
                    Thread.CurrentThread.CurrentUICulture = _uiCulture;
                }

                _disposed = true;
            }
        }
    }
}
以及创建输出标识符的类:

public string GetOutputIdentifier()
        {
            var currentTimeUtc = _systemClockService.UtcNow;

            var localTime = currentTimeUtc.LocalDateTime;

            var creationDate = localTime.ToString("yyyyMMdd");
            var creationTime = localTime.ToString("HHmmss");

            // code removed
        }

我在输出标识符函数中修复了它(感谢Panagiotis Kanavos,请参见注释)。不需要CurrentCultureScope

 var currentTimeUtc = _systemClockService.UtcNow;

 var nlZone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");

 var localTime = TimeZoneInfo.ConvertTime(currentTimeUtc, nlZone);

“我假设DateTimeOffset的.ToLocalTime为我提供了特定于文化的本地时间,但它保留在nl nl中”当您强制区域设置为
nl nl
时,您希望获得“本地”时间?本地时间与时区无关。我编辑了这篇文章。作用域必须为“en US”才能模拟Azure托管代理。使用“en-US”区域性作用域调试时,本地时间保持在nl nl…@PatrickPeters,这是因为区域性根本不影响时区。顺便说一句,UtcNow是一种静态方法。必须有一个编译器或Intellisense警告,表明您正在通过
CurrentCultureScope
类的对象引用调用静态方法,这是一个非常危险的想法。将CultureInfo作为参数传递给任何接受它的函数要安全得多,而不是依赖于全局状态。编译器或Intellisense(不记得是哪个)在每次使用调用可本地化方法时都会发出警告,而不指定区域性。
 var currentTimeUtc = _systemClockService.UtcNow;

 var nlZone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");

 var localTime = TimeZoneInfo.ConvertTime(currentTimeUtc, nlZone);