只显示日期,不显示时间


91

在MVC剃须刀中,我将这样的当前日期放入数据库中。

model.Returndate = DateTime.Now.Date.ToShortDateString();

由于数据库字段是datetime数据类型,并且我正在将当前日期转换为字符串格式,因此无法正常工作。我正在使用字符串格式,因为我希望日期以mm / dd / yyyy格式而不是mm / dd / yyyy hh:mm:ss时间格式。

编辑:

在控制器中,我有

var model = new ViewModel();
model.ReturnDate = DateTime.Now;            
return PartialView("PartialView", model);  

在局部视图中,我有

@Html.EditorFor(model => model.Returndate)

这是将日期显示为“日期和时间”的地方……我只希望显示日期。不是时间。我希望此编辑能够更好地解释。


1
不用担心00:00:00(午夜)。只需格式化输出ToString("mm/dd/yyyy");,就可以准确看到您想要的内容。
Chase Florell 2011年

1
将数据另存为DateTime。您在OUTPUT上进行字符串格式化...仅将其格式化为最终查看器。
Chase Florell 2011年

Answers:


96

如果列类型在SQL中为DateTime,则它将存储您传递或不传递的时间。

最好正确保存日期:

model.ReturnDate = DateTime.Now;

然后在需要显示它时对其进行格式化:

@Html.Label(Model.ReturnDate.ToShortDateString())

或者,如果您使用的是EditorFor:

@Html.EditorFor(model => model.ReturnDate.ToShortDateString())

要么

@Html.EditorFor(model => model.ReturnDate.ToString("MM/dd/yyyy"))

要将属性添加到模型中,请添加以下代码:

public string ReturnDateForDisplay
{
    get
    {
       return this.ReturnDate.ToString("d");
    }
}

然后在您的PartialView中:

@Html.EditorFor(model => model.ReturnDateForDisplay)

编辑:

嗨,大家好,我想说一句“如果您使用的是EditorFor”,这意味着您需要为要表示的值类型使用一个EditorFor模板。

编辑器模板是在MVC中管理重复控件的一种很酷的方法:

http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/

您可以将它们用于诸如String之类的天真类型,如上文所述;但是它们特别适合让您为一组更复杂的数据类型模板化一组输入字段。


不知道是谁拒绝了这个..但是我没有使用HTML.label来显示它。.我正在使用HTML.EditorFor(model => model.Returndate)在这种情况下如何格式化显示...
ZVenue

那只是一个如何格式化结果的例子;我将更新我的答案。
拉斯克拉克

14
@Russ:您所做的更新编辑器不起作用。它给我一个错误“模板只能与字段访问,属性访问,一维数组索引或单参数自定义索引器表达式一起使用”。
ZVenue 2011年

1
我将其添加到我的答案中
Russ Clarke

19
您应该从答案中删除“ @ Html.EditorFor(model => model.ReturnDate.ToShortDateString())”,因为这样做不起作用。
James Reategui 2012年

129

只需自己应对这种情况-找到了一种非常简单的方法,只需在模型中注释属性即可,如下所示:

[DataType(DataType.Date)]
public DateTime? SomeDateProperty { get; set; }

它将也从日期选择器中隐藏时间按钮。

抱歉,这个答案有点晚了;)


非常感谢。对我来说这是非常有帮助的帖子!+1
Dmytro

1
正是我所需要的。优秀的!
RealityDysfunction

1
最近我有个疑问,当输入类型是日期时,chrome将有趣的东西放进去,我认为这是html5的一部分,我想改用jquery datepicker,所以我使用了DataType.Text-仍然允许我使用足够酷的格式设置
John

2
不必为迟到而道歉,发布旧问题的答案对于非OP的人可能会有很大的帮助。这是我一直在寻找的答案,因为我知道这是可能的,但不记得要怎么做,而您在3年前发布了它。如果有的话,您太早了。
RyanfaeScotland,2015年

如果日期来自数据库,我不知道这将如何帮助...无法弄清楚
Antoine Pelletier

41

如果要显示在文本框中,则可以使用此方法:

@Html.TextBoxFor(m => m.Employee.DOB, "{0:dd-MM-yyyy}")

如果浏览器的设置格式与“ dd-MM-yyyy”不同,即“ MM-dd-yyyy”,则日期显示不正确
Oleg Sh 2015年

16

日期库中的日期/时间完全不会是格式化版本。它只是日期/时间本身。从数据库提取值时如何显示日期/时间是另一回事。我强烈怀疑您真的只想要:

model.Returndate = DateTime.Now.Date;

或可能

model.Returndate = DateTime.UtcNow.Date;

是的,如果你看一下使用SQL Server Studio或任何数据库,你现在看到的午夜-但是这无关紧要,当你取的日期从数据库中,并显示给用户,那么你可以申请相关的格式。

编辑:关于您编辑的问题,问题不在于模型-这是您指定视图的方式。您应该使用类似:

@Html.EditorFor(model => model.Returndate.Date.ToString("d"))

短日期格式d标准日期和时间格式说明符在哪里(这意味着它将考虑当前的文化设置)。

这就是我反复说的一句话-当您向用户显示日期/时间时,就是将其格式化为没有时间的日期的时间。

编辑:如果这不起作用,应该有一种用格式字符串装饰模型或视图的方法-诸如此类。我不是真正的MVC人士,但是感觉应该有一个很好的方式来声明地执行此操作...


DateTime.Now.Date仍显示时间和日期。
ZVenue 2011年

1
@ZVenue:显示在哪里?您应该存储 DateTime值,并在显示日期的任何地方使用仅日期格式的说明符。您提供的代码(在模型中设置一个属性)大概是用于存储的,因此时间为午夜没关系。
乔恩·斯基特

乔恩建议我在说什么,将日期保存到目前的状态。您可以在打印日期时适当地格式化日期。
拉斯克拉克,

2
@Jon:当我将您的编辑代码用于html.editorfor ...时,出现此错误。“模板只能与字段访问,属性访问,一维数组索引或单参数自定义索引器表达式一起使用”。 ...在运行时
ZVenue 2011年


8

您可以按如下方式修改ViewModel:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",ApplyFormatInEditMode = true)]

此解决方案还解决了Chrome的日期选择器冲突的问题。如果仅在Viewmodel中指定Datatype.Date,Chrome会在文本框中使用其自己的datepicker版本。谢谢!
凯瑟琳

7

您可以使用以下方法应用自定义日期时间格式 ToString

DateTime.Now.Date.ToString("MM/dd/yyyy");

DateTime.ToString可以在这里这里找到有关格式模式的更多信息

编辑:问题编辑后,就像其他建议一样,您应该在视图中应用日期格式:

model.Returndate = DateTime.Now.Date;

@Html.EditorFor(model => model.Returndate.Date.ToString("MM/dd/yyyy"))

1
但这并不能解决保存日期的问题。
拉斯克拉克

他不能通过打电话保存它model.Returndate.ToString("mm/dd/yyyy")吗?
Jalal Said

那是一个问题..我正在将该值放入数据库的datetime字段中。所以这行不通..请参阅我的原始帖子。
ZVenue 2011年

不应该是.ToString(“ MM / dd / yyyy”)吗?毫米是分钟,而不是几个月!
Bodrick 2011年

@Bodrich:谢谢,更新了,我只是复制粘贴了他的图案。
Jalal Said

4

我不确定在Razor中,但是在ASPX中可以做到:

 <%if (item.Modify_Date != null)
  {%>
     <%=Html.Encode(String.Format("{0:D}", item.Modify_Date))%>     
<%} %>

剃刀中一定有类似的东西。希望这会帮助某人。


1
是的,这也可以使用Razor语法,例如@ Html.Encode(string.Format(“ 0:D”,item.Modify_Date))
Ciaran Gallagher

4

如果您有如下所示的for循环。

@ item.StartDate更改为@ item.StartDate.Value.ToShortDateString()

万一您无法像我这样注释模型中的属性,这将节省时间。

<table>
  <tr>
   <th>Type</th>
   <th>Start Date</th>
  </tr>
    @foreach (var item in Model.TestList) {
      <tr>
        <td>@item.TypeName</td>
        <td>@item.StartDate.Value.ToShortDateString()</td>
      </tr>
      }
</table>

2

包括DisplayFormat和ApplyFormatInEditMode之类的数据注释以具有所需的输出。

[Display(Name = "Bill Date")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime BillDate { get; set; }

现在,您的帐单日期将显示为。

在此处输入图片说明


请看看其他答案。您是否认为有必要,并在帖子中添加了一些新的高质量内容?
L. Guthardt '18

1

您可以简单地转换日期时间。就像是:

@Convert.ToString(string.Format("{0:dd/MM/yyyy}", Model.Returndate))

1

我在此页面上的其他解决方案中遇到了一些问题,因此以为我应该考虑一下。

@Html.TextBoxFor(m => m.EndDate, "{0:d}", new { @class = "form-control datepicker" })

因此,您只需要在第二个参数中添加“ {0:d}”,就可以了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.