将DateTime转换为字符串格式yyyy-MM-dd时出错

时间:2014-04-01 10:08:47

标签: c# string date datetime datetime-parsing

我试图将一些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

谢谢

3 个答案:

答案 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.StartDatemodel.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