我具有以下单元测试,该单元测试在我们的一位开发人员的计算机上失败(他在结果变量中获得了一些滴答声,而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_NameCachedCultureshttp://referencesource.microsoft.com/#mscorlib/system/globalization/cultureinfo.cs,5fe58d4ecbba7689)中检查的GetCultureInfoHelper中与用户机相关的某种修改的日期时间。

我知道,如果您使用与Windows计算机相同的区域性进行调用,则CreateSpecificCulture方法可以返回用户修改的日期时间。但是我一直认为,无论如何,GetDateTime都将返回未修改的日期时间。

所以有两个问题:


修改后的CultureInfo是否可以存储在内部缓存中?
如果是这样,是通过手动调用CultureInfo获得未修改的new CultrueInfo("xy", false)的唯一方法吗?

最佳答案

当你做


  字符串值= dateTime.ToString();


这将使用CultureInfo.CurrentCulture。然后,您尝试使用...解析此字符串。


  CultureInfo.GetCultureInfo(CultureInfo.CurrentCulture.Name);


因此,您正在专门使用一种文化来解析与创建该字符串所使用的字符串不同的字符串。当然,在某些情况下这不会通过。

我建议这个问题是大多数人的机器上

Assert.AreEqual(CultureInfo.CurrentCulture, CultureInfo.GetCultureInfo(CultureInfo.CurrentCulture.Name));


会通过,但是在有问题的机器上不会通过,您的字符串也不会通过。

我建议您可能要使用CultureInfo.InvariantCulture。所以...

    [TestMethod]
    public void DateTimeStringDateTimeMinCurrentCultureToNullableDateTimeSuccessTest()
    {
        DateTime dateTime = new DateTime(1, 1, 1);
        string value = dateTime.ToStringInvariant();
        var result = value.ToNullableDateTime();
        Assert.AreEqual(dateTime, result);
    }


    public static string ToStringInvariant(this DateTime? date)
    {
        if (date.HasValue)
            return date.Value.ToStringInvariant();

        return null;
    }

    public static string ToStringInvariant(this DateTime date)
    {
        return date.ToString(CultureInfo.InvariantCulture);

    }
    /// <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.InvariantCulture);
    }

    /// <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;
    }

关于c# - DateTime.TryParse->“鬼滴答声”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31510014/

10-13 00:48