【发布时间】:2015-07-20 06:27:12
【问题描述】:
我有以下单元测试,它在我们的一位开发人员的机器上失败(他在结果变量中得到了一些滴答声,而 datetime 变量为零滴答声),但在其他所有机器上运行良好。
[TestMethod]
public void DateTimeStringDateTimeMinCurrentCultureToNullableDateTimeSuccessTest()
{
var dateTime = new DateTime(1, 1, 1);
string value = dateTime.ToString();
var result = value.ToNullableDateTime();
Assert.AreEqual(dateTime, result);
}
这是使用的扩展方法:
/// <summary>
/// Converts a string to a nullable DateTime. If the string is a invalid dateTime returns null.
/// Uses the current culture.
/// </summary>
public static DateTime? ToNullableDateTime(this string s)
{
//Don't use CultureInfo.CurrentCulture to override user changes of the cultureinfo.
return s.ToNullableDateTime(CultureInfo.GetCultureInfo(CultureInfo.CurrentCulture.Name));
}
/// <summary>
/// Converts a string to a nullable DateTime. If the string is a invalid dateTime returns null.
/// </summary>
public static DateTime? ToNullableDateTime(this string s, CultureInfo cultureInfo)
{
if (String.IsNullOrEmpty(s)) return null;
DateTime i;
if (DateTime.TryParse(s, cultureInfo, DateTimeStyles.None, out i)) return i;
return null;
}
我认为这可能与他使用的某些 Windows 日期时间设置有关。理论上ToNullableDateTime(string) 应该创建一个新的文化信息,它是用户机器中立的。 GetCultureInfo 应致电 new CultureInfo(name, false)。我唯一能想到的是,有一个缓存的文化信息,它在s_NameCachedCultures 中包含某种与用户机器相关的修改日期时间,在GetCultureInfoHelper (http://referencesource.microsoft.com/#mscorlib/system/globalization/cultureinfo.cs,5fe58d4ecbba7689) 中检查。
我知道,CreateSpecificCulture 方法可以返回用户修改的日期时间,如果您使用与 Windows 机器相同的文化来调用它。但我一直认为,GetDateTime 无论如何都会返回未修改的日期时间。
所以有两个问题:
- 是否有可能将修改后的
CultureInfo存储在内部缓存中? - 如果是这样,是否只有通过手动调用
new CultrueInfo("xy", false)来获得未修改的CultureInfo的方法?
【问题讨论】:
-
为什么在扩展方法的短重载中选择使用
CultureInfo.GetCultureInfo? documentation 表示比普通实例构造函数 (new CultureInfo(...)) 更喜欢它的原因是缓存速度。 -
知道
s和CultureInfo.CurrentCulture.Name在未通过测试的机器上以及在测试通过的机器上会很有帮助。