我有以下代码,它接受lines数组中的元素并检查它是否与datetime格式匹配。此检查仅在元素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.fff"许多人建议。我现在得到的输出是:
Date Wrong
Date: 23.59.59.999
更新3:
好的我现在已经尝试过" M / d / y H:m:s.fff"按照建议,我仍然得到输出:
Date Wrong
Date: 05/23/2005 23:59:59.999
答案 0 :(得分:3)
注意:在问题开始变形之前根据问题的原始修订进行回答。
为什么它会返回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));
输出
True
如果您希望允许单个数字月,则需要d
而不是dd
。为了让您更进一步,您需要确切了解您希望支持的日期格式。
答案 1 :(得分:2)
您尝试解析的日期时间格式错误。将其更改为:" 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
05/3/2005 23:59:59.999解析:2005-05-03 23:59:59
5/03/2005 23:59:59.999解析:2005-05-03 23:59:59
2005年5月3日23:59:59.999解析:2005-05-03 23:59:59
答案 2 :(得分:1)
我看不到行[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",
答案 3 :(得分:1)
使用这个(就像已经建议的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次&#34;成功&#34;
这只是一个概念证明,我不想要任何赞成。