1

我正在尝试将一些 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用 format 转换为字符串“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);

不知道问题是什么,可能是开始包含时间?我不知道。

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

谢谢

4

3 回答 3

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”

于 2014-04-01T10:15:56.733 回答
1

您似乎误解了ParseExact的工作原理(或实际上它的作用)。一般来说,解析是获取 X 类型的数据并将其转换为 Y 类型的过程——在这种情况下,DateTime这意味着将日期转换stringDateTime实例。这与您尝试执行的格式化实例的操作完全不同。DateTime

鉴于您已经有了不需要解析任何内容的日期,您需要做的就是格式化日期

model.StartDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);

CultureInfo.InvariantCulture使用固定格式时很重要,因为您要确保自己不了解文化,即您指定的格式正是您希望它在所有文化中显示的方式。

于 2014-04-01T10:16:54.857 回答
-1

使用.DateDateTime 的属性仅获取 Date 部分。您的 ToString() 还将根据当前的文化产生不同的结果,这意味着虽然您的 ToString() 和 TryParse 现在可能对您有用,但它会在其他国家/地区中断。

您可以使用 ToString() 重载来指定特定格式。可以在这里找到不同的格式

于 2014-04-01T10:14:26.480 回答