我有以下代码,它接受lines数组中的元素并检查它是否与日期时间格式匹配。这个检查只运行在元素37、38、40、41上。给出下面的代码和调试输出,我可以看到输出与解析匹配。那么为什么返回false呢?
可能的输入:
05/03/2005 23:59:59.999
05/3/2005 23:59:59.999
5/03/2005 23:59:59.999
5/3/2005 23:59:59.999
etc...
代码:
lines[i] = lines[i] + " 23:59:59.999"; //YYYY-MM-DDThh:mm:ss[.mmm]
DateTime datetest;
if (DateTime.TryParseExact(lines[i], "MM/dd/yyyy HH:mm:ss.mmm", new CultureInfo("en-US"), DateTimeStyles.None, out datetest))
{
}
else
{
//Log and Drop
logfile.WriteLine(System.DateTime.Now.ToString("yyyy.MM.dd.HH.mm.ss") + ": Row #" + row + ", Column #" + (i) + " was not a date in the right format, dropping line. ");
logfile.WriteLine("Original: " + lines[i]);
Console.WriteLine("Date Wrong");
Console.WriteLine("Date: " + lines[i]);
string input = Console.ReadLine();
continue;
}
控制台输出:
Date Wrong
Date: 5/23/2004 23:59:59.999
更新:
我尝试更改解析以查找M/dd/yyyy。然而,我现在得到的却是这样的输出:
Date Wrong
Date: 05/23/2005 23:59:59.999
更新2:好的,我试着改变解析来寻找"M/d/yyyy HH:mm:ss"。就像许多人建议的那样。我现在得到的输出是:
Date Wrong
Date: 23.59.59.999
更新3:好的,我现在已经尝试了"M/d/y H: M:s"。如建议的那样,我仍然得到如下输出:
Date Wrong
Date: 05/23/2005 23:59:59.999
注:答案基于问题开始变形前的原始修订。
为什么返回false呢?
MM
格式需要两位数字表示月份。您的日期字符串只有一个数字。使用M
月格式。毫秒格式字符串应该是fff
而不是mmm
。
M/dd/yyyy HH:mm:ss.fff
来演示:
DateTime datetest;
Console.WriteLine(DateTime.TryParseExact("5/23/2004 23:59:59.999",
"M/dd/yyyy HH:mm:ss.fff", new CultureInfo("en-US"), DateTimeStyles.None,
out datetest));
输出<>之前真正的之前如果您希望允许个位数月份,那么您需要d
而不是dd
。为了进行更深入的操作,您需要确定希望支持哪种格式的日期。
您尝试解析的日期时间格式错误。修改为:"M/dd/yyyy HH:mm:ss。fff "
对评论的回应:
DateTime datetest;
var dateTimes = new [] { "05/03/2005 23:59:59.999", "05/3/2005 23:59:59.999", "5/03/2005 23:59:59.999", "5/3/2005 23:59:59.999" };
foreach(var dateTimeToParse in dateTimes)
if (DateTime.TryParse("5/3/2005 23:59:59.999", new CultureInfo("en-US"), DateTimeStyles.None, out datetest))
Console.WriteLine(dateTimeToParse + " parses to: " + datetest);
else
Console.WriteLine("FAIL!");
在我的机器上运行:
05/03/2005 23:59:59 999解析到:2005-05-03 23:59:59
2012-05-03 23:59:59
5/03/2005 23:59:59.999解析到:2005-05-03 23:59:59
我看不到行[I]的内容,但是评论中描述的格式和TryParse中使用的格式之间的不匹配可能只是你的问题:
lines[i] = lines[i] + " 23:59:59.999"; //YYYY-MM-DDThh:mm:ss[.mmm]
...
if (DateTime.TryParseExact(lines[i], "MM/dd/yyyy HH:mm:ss.mmm",
使用这个(就像已经建议的Hans和David):
class Program
{
static void Main(string[] args)
{
List<String> datetimeList = new List<string>();
datetimeList.Add("05/03/2005 23:59:59.999");
datetimeList.Add("05/3/2005 23:59:59.999");
datetimeList.Add("5/03/2005 23:59:59.999");
datetimeList.Add("5/3/2005 23:59:59.999");
DateTime datetest;
foreach (string s in datetimeList)
{
if (!DateTime.TryParseExact(s, "M/d/yyyy HH:mm:ss.fff", new CultureInfo("en-US"), DateTimeStyles.None, out datetest))
{
Console.WriteLine("Error");
}
else
{
Console.WriteLine("Success");
}
}
Console.Read();
}
}
打印4次Success
这只是一个概念证明,我不想要任何支持