1

我有以下代码:

string[] format = { "yyyy/MM/dd", "MM/dd/yyyy" };
DateTime valueDate;
value = value.Replace("-", "/");
if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out valueDate))
{
    value = "TO_DATE(" + valueDate + ", 'yyyy-mm-dd')";
}
else
{
    throw new Exception("Could not parse incoming date: " + valueDate);
}

所以现在我有一个测试用例。并且 value = '2013/01/21' 在替换语句将“-”替换为“/”之后。

这应该匹配格式字符串数组中的第一个格式。但是 TryParseExact 不起作用,并且总是转到 else 路径。任何人都可以看到此代码中的任何错误吗?

4

2 回答 2

4

这不是TryParseExact问题所在,而是您的字符串的值。我这么说是因为这个小scriptcs脚本:

using System.Globalization;

string[] format = { "yyyy/MM/dd", "MM/dd/yyyy" };
DateTime valueDate;
var value = "2013/01/21";
if (DateTime.TryParseExact(value, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out valueDate))
{
    Console.WriteLine("Success!");
}
else
{
    Console.WriteLine("Failure!");
}

打印Success!。所以,换句话说,这个声明:

并且 value = '2013/01/21' 在替换语句将“-”替换为“/”之后。

从字面上看不可能是正确的。

正如詹姆斯所说,实际字符串值中很可能存在空格。有几个解决方案:删除空格或允许空格。要允许空格,您可以使用DateTimeStyles.AllowWhiteSpaces而不是DateTimeStyles.None.

于 2013-05-29T13:42:29.793 回答
0

不知道这是否是您的问题,但请确保在使用日期格式时始终避开正斜杠。/字符不是文字斜杠,而是您本地系统的日期分隔符(通常是正斜杠,但并非总是如此)。

使用格式字符串时,您可以使用真正的反斜杠转义正斜杠,例如:

DateTime.ParseExact("2012/12/31", "yyyy\\/MM\\/dd", null);
// or
DateTime.ParseExact("2012/12/31", @"yyyy\/MM\/dd", null);
于 2013-05-29T13:59:28.630 回答