我有以下日期的字符串格式" 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,你能告诉我为什么吗?以及如何将该字符串转换为日期。
答案 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
用于上午/下午。 我假设am
或pm
之间只有一个点。
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);
的影响
此属性一起返回的CultureInfo对象 及其关联对象,确定日期的默认格式, 时间,数字,货币值,文本的排序顺序,套管 约定和字符串比较。请参阅CultureInfo类 了解文化名称和标识符,两者之间的差异 不变的,中立的,特定的文化,以及文化的方式 信息影响线程和应用程序域。见 CultureInfo.CurrentCulture属性,了解线程的默认方式 确定文化,以及用户如何为他们设置文化信息 计算机。
答案 2 :(得分:0)
.
中的a.m
导致问题。假设您同时处理a.m
和p.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代替。