【问题标题】:How do I control the time format in an input field?如何控制输入字段中的时间格式?
【发布时间】:2020-02-07 04:33:54
【问题描述】:

我的模型有一个日期时间字段:

public DateTime ProjectStart { get; set; }

如果我希望时间以 24 小时格式显示,在视图中作为纯文本,我可以这样做(大写 HH):

@Model.ProjectStart.ToString("dd/MM/yyyy HH:mm")

但是如何控制输入字段中的时间格式?

<input asp-for="ProjectStart" class="form-control" />

时间以 24 小时格式存储在数据库中。只是输入字段显示错误。它应该以这种格式显示日期和时间:

dd/MM/yyyy HH:mm(例如 28/02/2019 17:45)

我的应用程序文化 (CultureInfo.CurrentCulture) 是 nb-NO,这是正确的。这种文化中日期和时间的标准格式是我试图在输入字段中显示的格式。 (Norwegian date and time formats)

更新

我尝试了两种解决方案,但都没有成功:

在视图模型中装饰属性:

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

在输入标签中添加标签助手属性asp-format

<!-- I tried several variations of this: -->
<input asp-for="ProjectStart" asp-format="{0:dd/MM/yyyy HH:mm}" class="form-control" />
<input asp-for="ProjectStart" asp-format="{0:dd.MM.yyyy HH:mm}" class="form-control" />
<input asp-for="ProjectStart" asp-format="{0:dd-MM-yyyy HH:mm}" class="form-control" />

两种解决方案都只是清空了输入字段中的值,只显示“mm/dd/yyyy --:-- --”,即格式没有改变,数据消失了。

更新 2

这是带有asp-format-attribute 的输入标签的渲染HTML:

<input class="form-control" 
       type="datetime-local" 
       data-val="true" 
       data-val-required="The Starttidspunkt field is required." 
       id="ProjectStart" 
       name="ProjectStart"
       value="12.10.2019 07:12" />

如您所见,格式正确,数据就在那里。但在我的浏览器中,日期选择器显示“mm/dd/yyyy --:-- --”。

【问题讨论】:

  • 你能从你的输入标签发布渲染的 HTML 吗?使用asp-format 属性。
  • @mxmissile 请参阅更新 2。HTML 中的格式正确,但 Chrome 中的日期选择器显示“mm/dd/yyyy --:-- --”。

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


【解决方案1】:

使用asp-format标签助手属性,例如:

asp-format="{0:yyyy-MM-ddTHH:mm}"

<input asp-for="ProjectStart" class="form-control" asp-format="{0:yyyy-MM-ddTHH:mm}" />

格式字符串必须符合this W3C document 中指定的 ISO-8601 日期格式子集。

【讨论】:

  • 这会将输入字段的内容从“10/09/2019 09:45 PM”更改为“mm/dd/yyyy --:-- --”。
  • 所需内容是完整的DateTime,日期和时间,但没有秒或毫秒,24 小时时间格式。像这样:“10/09/2019 22:05”
  • asp-format="{0:dd/MM/yyyy HH:mm}" 显示 09/10/2019 14:12
  • 不适合我。会不会有其他干扰格式的东西?铬合金?我电脑的系统设置?我在视图模型中没有任何格式装饰。
  • 很可能是文化设置。这实际上只是找到适合您的文化的formatstring 的问题。将dd/MM/yyyy HH:mm 替换为正确的字符串。
【解决方案2】:

当您应用 [DataType(DataType.Date)] 属性时,Razor 会使用“日期”类型呈现输入。这是一个 HTML 5 输入类型,它将呈现为浏览器控件(默认情况下您获得的日历)。但是,浏览器控件强制将日期显示为本地化(即美国为MM/dd/yyyy)。也就是说,浏览器中显示的格式取决于本地日期格式。

所以,如果你想显示dd/MM/yyyy的格式,你需要改变你的本地系统日期格式。你可以参考以下链接了解如何改变本地日期格式。

参考:https://www.moore.co.uk/msuk/moore-stephens-south/news/may-2016/has-upgrading-to-windows-10-affected-your-date-for

【讨论】: