我试图将一些DateTime值转换为字符串格式yyyy-MM-dd
。问题是我只需要日期但在我的情况下model.StartDate
包含日期和时间。将model.StartDate声明为字符串" start"看起来像这样:4/1/2014 12:00:00 AM
。尝试解析时出现此错误:
System.FormatException未被用户代码Message = String处理 未被识别为有效的DateTime。
我最好的猜测是发生错误,因为字符串包含日期和时间,但我可能是错的。如果我探索model.StartDate,我还可以找到Day,DayOfTheWeek等。这是正确的方法吗?我只想将model.StartDate
转换为字符串" start"格式为yyyy-MM-dd
。
继承我的代码:
string start = model.StartDate.ToString();
model.StartDate = DateTime.ParseExact(start, "yyyy-MM-dd", CultureInfo.InvariantCulture);
string end = model.EndDate.ToString();
model.EndDate = DateTime.ParseExact(end, "yyyy-MM-dd", CultureInfo.InvariantCulture);
Dunno问题是什么,可能是开始包含时间?我不知道。
model.StartDate和model.EndDate是视图模型中的DateTime属性:
[NopResourceDisplayName("Admin.GAStatistics.GAStatistics.StartDate")]
[UIHint("DateNullable")]
public DateTime? StartDate { get; set; }
[NopResourceDisplayName("Admin.GAStatistics.GAStatistics.EndDate")]
[UIHint("DateNullable")]
public DateTime? EndDate { get; set; }
编辑: 我在这里上传了一张图片,显示了我在调试器中获得的实际输出: https://imageshack.com/i/1n51u2p
谢谢
答案 0 :(得分:3)
您正在将日期转换为字符串,但未指定格式。尝试
string start = model.StartDate.ToString("yyyy-MM-dd);
ToString()
使用当前线程的Culture格式将日期转换为字符串,包括时间。使用的格式为G
,即一般日期和时间格式。
仅针对此格式,您无需指定CultureInfo.InvariantCulture,因为没有任何特定于文化的内容。然而,yyyy/MM/dd
格式的常见问题是某些文化使用-
作为日期说明符,/
是日期占位符。在这种情况下,您必须使用:
string start = model.StartDate.ToString("yyyy-MM-dd,CultureInfo.InvariantCulture);
<强>更新强>
根据评论,似乎model.StartDate
和model.EndDate
不是 DateTime对象,而是具有包含时间元素的特定格式的字符串。
您实际要做的是将原始字符串解析为DateTime对象,然后将此对象格式化为新格式字符串:
var date=DateTime.ParseExact(model.StartDate,"M/d/YYYY HH:mm:ss tt",
CultureInfo.InvariantCulture);
model.StartDate=date.ToString("yyyy-MM-dd",CultureInfo.InvariantCulture);
假设字符串为2014年4月1日的值“4/1/2014 12:00:00 AM”
答案 1 :(得分:1)
您似乎误解了ParseExact的工作方式(或实际上它的作用)。一般来说,解析是获取X类型数据并将其转换为Y类型的过程 - 在DateTime
的上下文中,这意味着将日期string
转换为DateTime
实例。这完全与您尝试执行的操作不同格式化 DateTime
实例。
鉴于您已经拥有了不需要解析任何内容的日期,您需要做的就是格式日期
model.StartDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
使用固定格式时, CultureInfo.InvariantCulture
非常重要,因为您希望确保自己无法识别文化,即您指定的格式完全您希望它如何显示所有文化。
答案 2 :(得分:-1)
使用DateTime的.Date
属性仅获取日期部分。你的ToString()也会根据当前文化产生不同的结果,这意味着当你的ToString()和TryParse现在可能适合你时,它会在其他国家中断。
您可以使用ToString()重载来指定特定格式。可以找到不同的格式here