gpt4 book ai didi

c# - 日期时间.TryParse -> "Ghost ticks"

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:55 24 4
gpt4 key购买 nike

我有以下单元测试,它在我们一位开发人员的机器上失败了(他在结果变量中得到了一些刻度,而 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 CultureInfo("xy", false) 获取未修改的 CultureInfo 的唯一方法吗?

最佳答案

当你做的时候

string value = 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# - 日期时间.TryParse -> "Ghost ticks",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31510014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com