首页 > 解决方案 > ASP.NET Core 将输入的时间跨度数据类型强制为 24 小时格式

问题描述

无论我做什么,我都无法让我的输入在时间跨度内显示为 24 小时格式

    public class Horario
    {
        public int Id { get; set; }

        [Required]        
        [DataType(DataType.Time)]
        [Display(Name = "Início")]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{HH:mm}")]
        public TimeSpan Inicio { get; set; }

        [Required]
        [DataType(DataType.Time)]
        [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{HH:mm}")]
        public TimeSpan Fim { get; set; }

    }

出于某种原因,无论我在格式字符串上写什么,它都会使用 AM/PM 将其呈现为 12h

        <div class="card card-body">
            <div class="form-group col-3">
                <label asp-for="Horario.Inicio" class="control-label"></label>
                <input asp-for="Horario.Inicio" class="form-control" />
                <span asp-validation-for="Horario.Inicio" class="text-danger"></span>
            </div>
            <div class="form-group col-3">
                <label asp-for="Horario.Fim" class="control-label"></label>
                <input asp-for="Horario.Fim" class="form-control" />
                <span asp-validation-for="Horario.Fim" class="text-danger"></span>
            </div>
        </div>

标签: c#htmlasp.net-core

解决方案


当您asp-for在输入上使用并且支持属性是 aTimeSpan时,Razor 会将其呈现为带有 的输入type="time"。“时间”输入类型通常呈现为浏览器控件,并且该浏览器控件将被本地化。基本值是 24 小时格式(如果不是,它实际上甚至不会工作,因为它必须是 ISO),但如果您的设备的文化是 12 小时,那么它就是这样显示的。没有办法解决这个问题,因为它是一个浏览器控件。

如果您真的不希望它像那样显示,那么您唯一的选择就是通过以下方式使用常规的“文本”输入类型:

<input asp-for="Horario.Inicio" type="text" class="form-control" />

然后,它将只是文本(无浏览器控制),并且将显示提供给输入的直接值。但是,您将丢失任何内置验证,当然用户输入时间也不会那么容易。他们可能会犯错误并输入无效的值。您可以通过 JS 添加自己的验证规则,甚至可以创建自己的自定义 JS 输入,但这一切都取决于您。


推荐阅读