DateTime.TryParseExact 只能单向工作

7

范围:

我一直在尝试开发一个 超容错 的 DateTime.Parse 程序,所以我决定尝试使用大多数“广泛使用”的格式,以更好地理解 格式掩码

问题:

我定义了一个特定的格式(字符串),我使用 myDate.ToString(format),它非常有效。问题是,如果我获取相同的字符串(.ToString(format) 操作的结果)并将其提供给 DateTime.TryParseExact(...),它会失败。

代码/测试:

System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture;

// Defining Format and Testing it via "DateTime.ToString(format)"
string format = "MM/dd/yyyy HH:mm:ss tt"; 
string dtNow  = DateTime.Now.ToString (format);
Console.WriteLine (dtNow);

// Trying to Parse DateTime on the same Format defined Above
DateTime time;
if (DateTime.TryParseExact (dtNow, format, provider,    System.Globalization.DateTimeStyles.None, out time))
{
    // If TryParseExact Worked
    Console.WriteLine ("Result: " + time.ToString ());  
}
else
{
    // If TryParseExact Failed
    Console.WriteLine ("Failed to Parse Date");
}

输出结果为:"无法解析日期"
问题:
为什么我可以使用“格式”字符串将某个日期格式化为文本,但我不能使用相同的“格式”将字符串反馈给日期对象?
编辑:
我已经将我的一部分方法添加到此示例中,并且我想知道为什么“ParseDate”方法无法返回正确的日期,考虑到“String”格式正确。

2
你的 CurrentCulture 是什么? - Soner Gönül
2
尝试使用 string dtNow = DateTime.Now.ToString(format, provider),在转换为字符串时添加区域设置。 - Sriram Sakthivel
1
确认在 pt-BR(葡萄牙语(巴西))上失败。 - Jesse Good
@MarcelloGrechiLins:这里有一个示例,使用CultureInfo.InvariantCulture,它不会失败。 - Jesse Good
@AdamV:是的,所以应该始终使用相同的文化。如果始终使用pt-BR,它能够正常工作的原因是CultureInfo.InvariantCulture期望在具有该格式的字符串中包含AM/PM指示符,而pt-BR则没有。 - Jesse Good
显示剩余4条评论
1个回答

5

由于您在使用DateTime.ToString()方法时没有使用任何IFormatProvider,因此该方法将使用您的CurrentCulture设置。

这就是为什么您的

string dtNow  = DateTime.Now.ToString (format);

使用line可能会产生不同于MM/dd/yyyy HH:mm:ss tt格式的字符串表示。

有三个因素可能导致此问题:

由于您尝试使用 InvariantCulture 作为 DateTime.TryParseExact 方法中的 provider 对字符串进行解析,因此请根据该提供程序生成您的字符串。

string dtNow  = DateTime.Now.ToString(format, provider);

你说你的CurrentCulturept-BR,这种文化中空字符串""作为AMDesignatorPMDesignator。这就是为什么你的dtNow字符串在表示部分上没有任何AM或PM指示符的原因。
这里有一个demonstration

我的代码第一行 (CultureInfo.InvariantCulture) 不应该解决这个问题吗? - Marcello Grechi Lins
@MarcelloGrechiLins 如果你在DateTime.Now.ToString()方法中使用它作为第二个参数,是的,它会修复它。 - Soner Gönül
我已经更新了我的问题,并提供了另一个例子。我不明白的是,为什么从“String”解析时它不起作用。这里没有日期,没有任何东西,只是一个符合“TryParseExact”方法指定格式的“String”。 - Marcello Grechi Lins
@MarcelloGrechiLins,System.Globalization.DateTimeStyles.AssumeUniversal | System.Globalization.DateTimeStyles.AdjustToUniversal | System.Globalization.DateTimeStyles.AllowInnerWhite | System.Globalization.DateTimeStyles.AllowLeadingWhite | System.Globalization.DateTimeStyles.AllowTrailingWhite 的作用是什么?你真的确定你读懂了 DateTimeStyles 的具体含义吗? - Soner Gönül
这里的想法是尽可能地容错。我会再次检查这些标志,看看是否真的搞砸了事情。 - Marcello Grechi Lins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接