在linq语句中格式化DateTime字符串

时间:2019-03-11 15:03:58

标签: c# entity-framework linq datetime-format

我设置了一个Web API,用于通过实体框架在我的网站上显示信息。我正在过滤数据,因此它只会拉回我想要的特定部分,其中包括一个DateTime值。

[HttpGet]
public IEnumerable<Log> XmlLog()
{
   var userLog = _db.Logs.Where(x => x.EngineType == "Xml");

   return userLog .ToList();
 }

这将我的日期显示为:

2019-02-05T15:11:50.39

我需要做的是将DateTime格式更改为其他格式。理想情况下: Saturday 2 February 9:12:30

在linq通话中,我尝试了以下操作:

[HttpGet]
public IEnumerable<Log> XmlLog()
{
   var userLog = _db.Logs.Select(d => d.LogDate.ToString("f")).Where(x => x.EngineType == "Xml");

   return userLog .ToList();
 }

在模型本身上,我尝试了以下属性:

[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:yyyy/MM/dd HH:mm:ss}")]
public DateTime LogDate { get; set; }

我的任何尝试都没有成功。我在陈述中做错了什么?

以上内容是用DotNet 4.7而不是DotNetCore编写的。

1 个答案:

答案 0 :(得分:2)

正如John所评论的那样,您的LINQ应该抛出异常,因为您首先选择字符串,然后尝试像对待对象一样过滤它们。

但是无论如何,这种方法都是倒退的。这只是关于获取数据的信息,因此它应该保持原样,而不进行任何格式化。让您的视图层负责格式化。

DisplayFormat属性非常有用,但前提是您使用的是Html.DisplayFor / Html.EditorFor助手。如果您认为自己只是在做@Model.LogDate之类的事情,请考虑以您需要的格式调用ToString(format)

最后,您的格式与您希望的示例不同。您要寻找的正确格式是:dddd, dd MMMM HH:mm:ss

总而言之,保留过滤器不变,并在此注释中使用DisplayFor

[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:dddd, dd MMMM HH:mm:ss}")]
public DateTime LogDate { get; set; }

...

@Html.DisplayFor(m => m[i].LogDate)

或者不用理会任何注释,只需使用

@Model[i].LogDate.ToString("dddd, dd MMMM HH:mm:ss")