DateTime.TryParse问题,日期由a.m而不是am

时间:2017-04-05 10:43:55

标签: c# datetime

我有以下日期的字符串格式" 2017-04-05 05:00:00 a.m" 。现在我尝试使用以下代码将其转换为datetime格式:

var dateTime="2017-04-05 05:00:00 a.m";
DateTime value = DateTime.MinValue;
DateTime.TryParse(dateTime, out value );

但我总是在{1/1/0001 12:00:00 AM}获得dt,你能告诉我为什么吗?以及如何将该字符串转换为日期。

3 个答案:

答案 0 :(得分:10)

您可以尝试使用自定义上午/下午指示符创建自定义DateTimeFormatInfo

var formatInfo = (DateTimeFormatInfo) CultureInfo.InvariantCulture.DateTimeFormat.Clone();
formatInfo.AMDesignator = "a.m";
formatInfo.PMDesignator = "p.m";

var value = DateTime.Parse("2017-04-05 05:00:00 a.m", formatInfo); 

这也适用于下午时间:

var value = DateTime.Parse("2017-04-05 03:00:00 p.m", formatInfo); 

答案 1 :(得分:2)

您解析的DateTime字符串未获得默认值。其中一个原因是你的日期字符串中的a.m.它还取决于当前thread Culture设置。您可以使用TryParseExact在DateTime字符串中为CulureInfo提供格式。

DateTime.TryParseExact(dateTime, "yyyy-MM-dd hh:mm:ss 'a.m'", CultureInfo.InvariantCulture,DateTimeStyles.None, out value);

请注意,你有a.m而不是am,必须像我在上面的例子中使用'a.m'那样进行转义。

你可以拥有p.m以及以上不会为此工作。您可以使用空字符串替换点,以使a.m转为am,将p.m替换为pm,以便将Custom Date and Time Format Strings tt用于上午/下午。 我假设ampm 之间只有一个点。

string dateTime = "2017-04-05 05:00:00 a.m";
dateTime = dateTime.Replace(".", ""); 
DateTime value = DateTime.MinValue;
DateTime.TryParseExact(dateTime, "yyyy-MM-dd hh:mm:ss tt", CultureInfo.InvariantCulture,DateTimeStyles.None, out value);

详细了解Thread.CurrentCulture

的影响
  

此属性一起返回的CultureInfo对象   及其关联对象,确定日期的默认格式,   时间,数字,货币值,文本的排序顺序,套管   约定和字符串比较。请参阅CultureInfo类   了解文化名称和标识符,两者之间的差异   不变的,中立的,特定的文化,以及文化的方式   信息影响线程和应用程序域。见   CultureInfo.CurrentCulture属性,了解线程的默认方式   确定文化,以及用户如何为他们设置文化信息   计算机。

答案 2 :(得分:0)

.中的a.m导致问题。假设您同时处理a.mp.m,请尝试在尝试解析.值之前删除DateTime个字符。

var stringToParse = "2017-04-05 05:00:00 a.m";

DateTime parsedValue;
DateTime.TryParse(stringToParse.Replace(".", string.Empty), out parsedValue);

如果由于任何其他原因在字符串中的其他位置使用.字符,则无效。例如,小数秒。如果是这种情况,最好使用Joe's answer代替。