【问题标题】:Display only date and no time只显示日期,不显示时间
【发布时间】:2011-10-30 18:23:41
【问题描述】:

在 MVC razor 中,我像这样将当前日期放入数据库中..

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

由于数据库字段是日期时间数据类型,并且我正在将当前日期转换为字符串格式,所以这不起作用.. 我该怎么做?我正在使用字符串格式,因为我想要 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)

这是将日期显示为日期和时间的地方...我只想显示日期。不是时候。我希望这个编辑能更好地解释。

【问题讨论】:

  • 不用担心 00:00:00(午夜)。只需格式化输出 ToString("mm/dd/yyyy"); 即可准确查看您想要的内容。
  • 将数据库中的数据保存为DateTime。您在 OUTPUT 上进行字符串格式化...仅将其格式化为最终查看器。

标签: c# asp.net-mvc asp.net-mvc-3 datetime


【解决方案1】:

只需自己处理这种情况 - 找到了一种非常简单的方法,只需像这样在模型中注释您的属性:

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

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

对不起,如果这个答案有点晚了;)

【讨论】:

  • 非常感谢。这对我很有帮助! +1
  • 正是我所需要的。太棒了!
  • 我最近有一个位置,当输入类型是日期时,chrome 会在其中放入有趣的东西,我认为是 html5 的一部分,我想改用 jquery datepicker,所以我选择了 DataType.Text - 这仍然允许我使用足够酷的格式
  • 不必为迟到而道歉,发布老问题的答案对于非 OP 的人来说是一个很大的帮助。这是我一直在寻找的答案,因为我知道这是可能的,但不记得如何了,你在 3 年前发布了它。如果有的话,你来得太早了。
  • 如果日期来自数据库,我不知道这有什么帮助......无法弄清楚
【解决方案2】:

如果 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) 如何格式化显示这个案子……
  • 这只是如何格式化结果的示例;我会更新我的答案。
  • 我认为如果该值逻辑上只是一个日期,那么也值得只存储日期部分,即使无论如何时间都会被剥离。
  • @Russ:您所做的更新编辑器不起作用。它给了我一个错误“模板只能用于字段访问、属性访问、单维数组索引或单参数自定义索引器表达式。”
  • 你应该从答案中删除 '@Html.EditorFor(model => model.ReturnDate.ToShortDateString())' 因为这不起作用。
【解决方案3】:

如果你想在 TextBox 中显示,这很有效:

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

【讨论】:

  • 如果浏览器在设置中的格式与“dd-MM-yyyy”不同,即“MM-dd-yyyy”,日期将显示不正确
【解决方案4】:

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

model.Returndate = DateTime.Now.Date;

或者可能

model.Returndate = DateTime.UtcNow.Date;

是的,如果您使用 SQL Server Studio 或其他工具查看数据库,您现在会看到午夜 - 但这无关紧要,当您从数据库中获取日期并将其显示给用户时,然后 你可以应用相关的格式。

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

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

其中d 是短日期模式的standard date and time format specifier(这意味着它将考虑当前的文化设置)。

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

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

【讨论】:

  • DateTime.Now.Date 仍然显示时间和日期。
  • @ZVenue:显示在哪里?您应该存储 DateTime 值,并在显示 日期的任何位置使用仅日期格式说明符。您给出的代码(在模型中设置属性)大概是用于存储的,所以它有一个午夜的时间并不重要。
  • Jon 建议我在说什么,将日期保存到 SQL 中;然后,您可以在打印时适当地格式化您的日期。
  • @Jon:当我将您的编辑代码用于 html.editorfor... 时出现此错误。“模板只能用于字段访问、属性访问、单维数组索引或单参数自定义索引器表达式"....在运行时
  • @ZVenue:也看看这个:stackoverflow.com/questions/5033902/…
【解决方案5】:

您可以如下修改您的 ViewModel:

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

【讨论】:

  • 这个方案也解决了Chrome的datepicker冲突问题。如果您只是在 Viewmodel 中指定 Datatype.Date,Chrome 会在文本框中使用自己的 datepicker 版本。谢谢!
【解决方案6】:

您可以使用ToString 应用自定义日期时间格式,例如:

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

关于DateTime.ToString 格式模式的进一步阅读可以找到herehere

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

model.Returndate = DateTime.Now.Date;

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

【讨论】:

  • 这无助于保存日期的问题。
  • 他不能通过调用model.Returndate.ToString("mm/dd/yyyy")来保存它吗?
  • 那是个问题。我将该值放在数据库中的日期时间字段中。所以这不起作用..请参阅我的原始帖子。
  • 不应该是.ToString("MM/dd/yyyy")吗? mm 是分钟,而不是月!
  • @Bodrich:谢谢,更新了,不过我只是复制粘贴他的模式。
【解决方案7】:

如果你有一个如下的 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>

【讨论】:

    【解决方案8】:

    在 Razor 中我不确定,但在 ASPX 中你可以:

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

    Razor 中一定有类似的东西。希望这会对某人有所帮助。

    【讨论】:

    • 是的,这也适用于 Razor 语法,例如@Html.Encode(string.Format("0:D", item.Modify_Date))
    【解决方案9】:

    包括 DisplayFormat 和 ApplyFormatInEditMode 等数据注释以获得所需的输出。

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

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

    【讨论】:

    • 请查看其他答案。您认为您的帖子是否有必要并在帖子中添加了一些新的优质内容?
    【解决方案10】:

    您可以简单地转换日期时间。比如:

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

    【讨论】:

    • 谢谢@ANJYR,这个对我有用。我正在为 DateTime 字段使用 PickADay 库。也许这就是为什么任何其他提议的解决方案都适用于我的案例。
    【解决方案11】:

    我在使用此页面上的其他解决方案时遇到了一些问题,所以我想将其放入。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多