C# 本地计算机和服务器上相同的区域性设置会产生不同的AMDesigner 概述

C# 本地计算机和服务器上相同的区域性设置会产生不同的AMDesigner 概述,c#,datetime,cultureinfo,culture,uiculture,C#,Datetime,Cultureinfo,Culture,Uiculture,本地计算机和服务器上都进行了一致的区域性设置,但它们会生成格式不同的日期时间字符串: local: "22/11/2016 12:00:00 AM" server: "22/11/2016 12:00:00 a.m." 上下文 语言:C#6 平台:.NET 4.6.1 本地操作系统:Windows 10 Pro 服务器操作系统:Windows Server 2012 R2,版本6.3 背景 我正在编写一个单元测试,无论在哪里运行,我都希望它的行为完全相同。为此,我创建了一个自定义属性,在

本地计算机和服务器上都进行了一致的
区域性设置
,但它们会生成格式不同的
日期时间
字符串:

local:  "22/11/2016 12:00:00 AM"
server: "22/11/2016 12:00:00 a.m."
上下文
  • 语言:C#6
  • 平台:.NET 4.6.1
  • 本地操作系统:Windows 10 Pro
  • 服务器操作系统:Windows Server 2012 R2,版本6.3
背景 我正在编写一个单元测试,无论在哪里运行,我都希望它的行为完全相同。为此,我创建了一个自定义属性,在测试期间手动设置机器的当前
CultureInfo
。这样,如果我在新西兰本地运行测试,它在美国的AWS服务器上运行时的行为仍然相同(在本例中,是为了确保日期字符串的格式一致,其中新西兰=dd/mm/yyyyy和美国=mm/dd/yyyyy)或世界其他任何地方

到目前为止,“自定义”属性正确设置机器的区域性设置,并正确设置新西兰(dd/mm/yyyy)和美国(mm/dd/yyyy)之间的日期和时间格式,但我的本地机器在时间后输出“AM”,而服务器输出“a.m.”(请参见下面的代码,这是
DateTimeFormat
类的
AMDesignator
属性)。似乎服务器正在从指定的
CultureInfo
之外获取格式设置,为什么会发生这种情况?我是否遗漏了什么

注意-
CultureSwitcher.SetTo(CultureInfo-culture)
CurrentCulture
CurrentUICulture
设置为提供的指定
CultureInfo

结果(本地|服务器): 自己试试(结果=本地|服务器):
我在这里面临的类似问题似乎与2012服务器有关。我在这里面临的类似问题似乎与2012服务器有关。
using (var poly = PAssert.Poly())
{
    var date = new DateTime(2016, 11, 22);

    // New Zealand culture
    using (CultureSwitcher.SetTo(new CultureInfo("en-NZ")))
    {
        var currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
        var amDesignator = currentCulture.DateTimeFormat.AMDesignator;
        var currencySymbol = currentCulture.NumberFormat.CurrencySymbol;

        poly.IsTrue(() => System.Threading.Thread.CurrentThread.CurrentCulture.ToString() == "en-NZ");      // True | True
        poly.IsTrue(() => System.Threading.Thread.CurrentThread.CurrentUICulture.ToString() == "en-NZ");    // True | True
        poly.IsTrue(() => CultureInfo.CurrentCulture.ToString() == "en-NZ");                                // True | True
        poly.IsTrue(() => CultureInfo.CurrentUICulture.ToString() == "en-NZ");                              // True | True
        poly.IsTrue(() => amDesignator == "AM");                                                            // True | FALSE - expected "a.m."
        poly.IsTrue(() => date.ToString() == "22/11/2016 12:00:00 AM");                                     // True | FALSE - expected "22/11/2016 12:00:00 a.m."
    }
    // United States culture
    using (CultureSwitcher.SetTo(new CultureInfo("en-US")))
    {
        var culture = CultureInfo.CreateSpecificCulture("en-US");
        var amDesignator = culture.DateTimeFormat.AMDesignator;
        var currencySymbol = culture.NumberFormat.CurrencySymbol;

        poly.IsTrue(() => System.Threading.Thread.CurrentThread.CurrentCulture.ToString() == "en-US");      // True | True
        poly.IsTrue(() => System.Threading.Thread.CurrentThread.CurrentUICulture.ToString() == "en-US");    // True | True
        poly.IsTrue(() => CultureInfo.CurrentCulture.ToString() == "en-US");                                // True | True
        poly.IsTrue(() => CultureInfo.CurrentUICulture.ToString() == "en-US");                              // True | True
        poly.IsTrue(() => amDesignator == "AM");                                                            // True | True
        poly.IsTrue(() => date.ToString() == "11/22/2016 12:00:00 AM");                                     // True | True
    }
}
using System;
using System.Globalization;

namespace ConsoleApplication
{
    class Program
    {
        static void Main()
        {
            // New Zealand culture
            System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-NZ");
            System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-NZ");

            Console.WriteLine(CultureInfo.CurrentCulture.DateTimeFormat.AMDesignator);                  // "AM" | "a.m."
            Console.WriteLine(CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat.AMDesignator);  // "AM" | "AM"
            Console.WriteLine(CultureInfo.CreateSpecificCulture("en-NZ").DateTimeFormat.AMDesignator);  // "AM" | "a.m."

            // United States culture
            System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
            System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");

            Console.WriteLine(CultureInfo.CurrentCulture.DateTimeFormat.AMDesignator);                  // "AM" | "AM"
            Console.WriteLine(CultureInfo.CreateSpecificCulture("en-US").DateTimeFormat.AMDesignator);  // "AM" | "AM"
            Console.WriteLine(CultureInfo.CreateSpecificCulture("en-NZ").DateTimeFormat.AMDesignator);  // "AM" | "a.m."
        }
    }
}