我有以下單元測試,它在我們的開發人員(他在結果變量中得到一些滴答聲,而日期時間變量在零滴答)的機器上失敗,但在其他機器上運行良好。DateTime.TryParse - >「Ghost ticks」
[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;
}
我想,這可能與他使用了一些窗口日期時間設置。理論上,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'?該[文檔](https://msdn.microsoft.com/en-us/library/yck8b540.aspx)說,喜歡它比普通實例構造函數('new CultureInfo(...)')更快的原因是因爲的緩存。 –
瞭解's'和'CultureInfo.CurrentCulture.Name'在測試失敗的機器上以及測試通過的機器上會有所幫助。 –