ตัวแก้ไขสำหรับใส่เฉพาะเวลาไม่สามารถตั้งค่าเป็นรูปแบบ 24 ชั่วโมงได้

ฉันกำลังลองใช้หลายๆ อย่าง เช่น DataFormatString ที่แตกต่างกัน หรือแม้แต่การควบคุมที่แตกต่างกันเพื่อให้มันใช้รูปแบบ 24 แต่ยังคงเป็นรูปแบบ AM/PM จะทำให้เป็นรูปแบบ 24 ชั่วโมงได้อย่างไร

แก้ไข: หลังจากค้นหาเพิ่มเติม ฉันพบว่าโค้ดเดียวกันนี้แสดงรูปแบบ 24 ชั่วโมงสำหรับบางคน ดังนั้นฉันจึงสามารถจัดรูปแบบใหม่เป็น: อะไรที่สามารถกำหนดค่าเป็น AM/PM ในพีซีของฉันได้ ฉันเปลี่ยนภาษาใน web.config เป็นภาษา 24 ชั่วโมงแล้ว แต่ผลลัพธ์ก็เหมือนเดิม การตั้งค่าภูมิภาคของฉันคือเวลา 24 ชั่วโมงเช่นกัน

ดู:

<div class="col-md-2">
    Horario teórico Desde
    @Html.EditorFor(model => model.HorarioTeoricoDesde, new { htmlAttributes = new { @class = "form-control form-control-sm" } })
    @Html.ValidationMessageFor(model => model.HorarioTeoricoDesde, "", new { @class = "text-danger" })
</div>

ดูโมเดล:

[Display(Name = "Horario Teorico Desde")]
[Required(ErrorMessage = "El Horario Teorico Desde es Requerido")]
[DataType(DataType.Time)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm}")]
public DateTime? HorarioTeoricoDesde { get; set; }

การตั้งค่าภูมิภาคของฉันคือ 24 ชั่วโมง เป็นภาษาสเปน นี่คือ web.config ของฉัน:

  <system.web>
    <globalization culture="es-AR" uiCulture="es-AR" />

ฉันเห็นแบบนี้:

นี่คือวิธีที่ฉันเห็น:

ขอบคุณ!!


person JCIsola    schedule 23.03.2020    source แหล่งที่มา


คำตอบ (3)


เมื่อคุณใช้ DataType.Time อินพุตจะเป็นประเภท time

Input type time is new in HTML5. Support of this type is still very poor. Even though you see the time in HH:MM AM/PM format (24 version (under development at this moment)), on the backend it still works in 24 hour format, you can try using some basic javascript to see that.

ตัวอย่าง: การใช้ bootstrap-timepicker

มุมมองรุ่น:-

public class Time24ViewModel
{
    [DataType(DataType.Time)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:HH:mm}")]
    public DateTime? HorarioTeoricoDesde { get; set; }

    [Display(Name = "Horario Teorico Desde")]
    [Required(ErrorMessage = "El Horario Teorico Desde es Requerido")]
    public string HorarioTeoricoDesdeStr
    {
        get
        {
            return HorarioTeoricoDesde.HasValue ? HorarioTeoricoDesde.Value.ToString("HH:mm") : "";
        }
        set
        {
            if (!string.IsNullOrWhiteSpace(value))
            {
                var time = TimeSpan.Parse(value);
                HorarioTeoricoDesde = new DateTime(time.Ticks);

            }
        }
    }
}

ตัวควบคุม:-

public class TimeController : Controller
{
    // GET: Time
    public ActionResult Time24()
    {
        var model = new Time24ViewModel
        {
            HorarioTeoricoDesde = DateTime.Now
        };
        return View(model);
    }
    [HttpPost]
    public ActionResult Time24(Time24ViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        return View(model);
    }
}

ดู:-

<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-timepicker/0.5.2/js/bootstrap-timepicker.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-timepicker/0.5.2/css/bootstrap-timepicker.css" rel="stylesheet" />

@using (Html.BeginForm("Time24", "Time", FormMethod.Post)) { 
<div class="col-md-2">
    Horario teórico Desde
    @Html.EditorFor(model => model.HorarioTeoricoDesdeStr, new { htmlAttributes = new { @class = "form-control form-control-sm" } })
    @Html.ValidationMessageFor(model => model.HorarioTeoricoDesdeStr, "", new { @class = "text-danger" })
</div>
<div class="col-md-2">
    <input type="submit" class="btn btn-dark" value="Submit"/>
</div>
}

<script>
    $('#HorarioTeoricoDesdeStr').timepicker({
        showMeridian: false
    });
</script>

(ทดสอบแล้ว)

person Ashiquzzaman    schedule 31.03.2020

เมื่อคุณใช้ [DataType(DataType.Time)] วิธีการ EditorFor จะแสดงผลอินพุตประเภท time
ตาม เอกสารประกอบ อินพุตนี้แสดงเวลาในรูปแบบที่สอดคล้องกับภาษาของเบราว์เซอร์
ภายใน value ของอินพุตยังอยู่ในรูปแบบ 24 ชม. ใช่หรือไม่ เกี่ยวกับวิธีการแสดงเวลาเพียงอย่างเดียว

ตัวอย่างเช่น:

<input type="time" value="23:13" class="text-box single-line" data-val="true" id="HorarioTeoricoDesde" name="HorarioTeoricoDesde">

ผลลัพธ์นี้ใน Firefox เป็นภาษาอังกฤษ:
ป้อนคำอธิบายรูปภาพที่นี่

หากคุณต้องการเขียนทับ คำถามนี้มีคำตอบอยู่บ้าง


คำตอบเก่า ใช้งานได้ในบางกรณี แต่ด้วยเหตุผลที่ผิด:
หากประเภทของคุณสมบัติคือ DateTime คุณต้องใช้สิ่งนี้

[DataType(DataType.DateTime)]

แทน

[DataType(DataType.Time)]

ในทางกลับกัน หากคุณต้องการเพียงส่วนของเวลา คุณอาจพิจารณาใช้ TimeSpan แทน DateTime แต่นั่นขึ้นอยู่กับโครงการของคุณ

person colinD    schedule 25.03.2020
comment
สิ่งที่ฉันต้องรู้คือจะทำให้คำอธิบายประกอบทำงานได้เป็นเวลา 24 ชั่วโมง ซึ่งไม่ได้ผล และการใช้วัฒนธรรมที่ใช้ 24 ชั่วโมงก็ไม่ได้ช่วยอะไรเช่นกัน DateTime แสดงวันที่ ซึ่งไม่มีประโยชน์สำหรับฉัน การใช้ TimeSpan ฉันสูญเสียการตรวจสอบและคำอธิบายประกอบ ViewModel - person JCIsola; 27.03.2020
comment
เบราว์เซอร์ของคุณเป็นภาษาใด เมื่อคุณใช้ DataType.Time อินพุตจะเป็นประเภท 'time' และฉันเชื่อว่าเบราว์เซอร์จะแทนที่รูปแบบที่คุณให้กับ DisplayFormat และใช้วัฒนธรรมอย่างใดอย่างหนึ่ง นั่นจะอธิบายด้วยว่าเหตุใดโค้ดของคุณจึงใช้ได้กับบางคนและไม่ใช่สำหรับคนอื่น - person colinD; 27.03.2020
comment
ใช่ ฉันได้อ่านเกี่ยวกับเบราว์เซอร์ แต่ฉันได้ทดสอบเป็น Chrome ภาษาอังกฤษในพีซีของฉัน และทดสอบด้วย Chrome สเปนในเซิร์ฟเวอร์การพัฒนา ซึ่งทั้งคู่แสดงรูปแบบ AM/PM บางทีมันอาจจะเป็นอย่างอื่นในการกำหนดค่าของเบราว์เซอร์ - person JCIsola; 27.03.2020
comment
แปลกมาก ฉันทดสอบกับ Chrome และหากตั้งค่าเป็นภาษาสเปน แสดงเวลาโดยไม่มี AM/PM ในขณะที่ภาษาอังกฤษแสดง - person colinD; 27.03.2020

การเปลี่ยนโลคัลจะไม่ช่วย (!) -> ประเด็นก็คือมันให้เอาต์พุตที่แตกต่างกันในภาษาเริ่มต้นที่แตกต่างกัน (ฝั่งไคลเอ็นต์)
ตัวอย่างเช่น:

    en_SS: 12:00 AM
    fr_BL: 00:00
    ps_AF: 0:00
    es_CO: 12:00 a.m.

ดังนั้นคุณสามารถลองได้

@item.Date.ToString("0:HH:mm")

OR

หากต้องการเพิ่มคุณสมบัติให้กับโมเดลของคุณ ให้เพิ่มโค้ดนี้:

public string ReturnDateForDisplay
{
    get
    {
       return this.ReturnDate.ToString("0:HH:mm");
    }
}

จากนั้นใน PartialView ของคุณ:

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

สำหรับการเปลี่ยนแปลง สร้างมุมมอง สิ่งที่คุณต้องทำคือใช้รูปแบบที่คุณต้องการในการเรียกตัวช่วย html เช่น

 @Html.TextBoxFor(m => m.YOUR_INPUT, "{0:HH:mm}")

แก้ไข
เพื่อให้ได้ผลลัพธ์ที่คุณต้องการ (แสดงตัวยึดตำแหน่งและการตรวจสอบ):

ใช้ TextBoxFor() มากเกินไปพร้อมกับอาร์กิวเมนต์ htmlAttributes อาร์กิวเมนต์นี้ควรเป็นวัตถุที่ไม่ระบุชื่อพร้อมคุณลักษณะทั้งหมดที่คุณต้องการกำหนดให้กับอินพุต
ตัวอย่างเช่น หากคุณต้องการตั้งค่าตัวยึดตำแหน่งและแอตทริบิวต์ของคลาส:

@Html.TextBoxFor( model => model.HorarioTeoricoDesde, "{0:HH:mm}", new { 
       @class = "form-control datecontrol", type = "date" })

วิธีแก้ไขอื่นๆ ที่เป็นไปได้: ฟอรัม ASP.Net
ข้อมูลเพิ่มเติม:
แนวทางที่แนะนำคือการใช้รูปแบบทั่วไปสำหรับปัญหาที่อาจเกิดขึ้นทั้งหมด จากนั้นจึงไคลเอนต์ (UI เว็บของคุณ) สามารถจัดรูปแบบค่าได้อย่างถูกต้องก่อนที่จะส่งไปยังส่วนหลัง / API สำหรับวันที่และเวลาวันที่ ให้ใช้รูปแบบ ISO 8601 และให้ประเภทตัวแปรที่ยอมรับเป็นสตริงในส่วนหลัง

ค่าเวลาจะแสดงเป็น เช่น 13:24 (HH:mm) เป็นที่นิยมด้วยเหตุผลบางประการ:

  • รูปแบบวันที่ไม่เปลี่ยนแปลงระหว่างรูปแบบ
  • สตริงไม่มีส่วนของค่าที่แยกวิเคราะห์อย่างไม่ถูกต้อง
  • ปัญหา UTC / offset ไม่เกิดขึ้นระหว่างไคลเอนต์และเซิร์ฟเวอร์
  • สตริงรูปแบบ ISO สามารถจัดเรียงได้
person Codebreaker007    schedule 27.03.2020
comment
การเปลี่ยนสถานที่ไม่ได้ช่วยอะไร นอกจากนี้ การอ่านข้อมูลจากฟิลด์นั้นไม่เป็นปัญหา เนื่องจากจะแสดงในรูปแบบ 24hs อย่างสมบูรณ์แบบในตาราง HTML และในมุมมองรายละเอียดด้วย แต่ไม่อยู่ในมุมมองสร้าง ปัญหาคือรูปแบบ 12 ชม. บวกกับตัวยึดตำแหน่ง AM / PM ในตัวควบคุมและการตรวจสอบความถูกต้องในมุมมองสร้าง รูปภาพนั้นในโพสต์ของฉันแสดงตัวควบคุมในมุมมองสร้าง - person JCIsola; 29.03.2020
comment
ดูการแก้ไขของฉันคุณควรชี้แจงคำถามของคุณ - person Codebreaker007; 29.03.2020
comment
@ Html.TextBoxFor(model =› model.HorarioTeoricoDesde, {0:HH:mm}) นั่นกำลังแสดงกล่องข้อความว่างโดยไม่มีการตรวจสอบหรือตัวยึดตำแหน่งสำหรับชั่วโมงและนาที พยายามโดยมีหรือไม่มีประเภทข้อมูลใน ViewModel - person JCIsola; 29.03.2020
comment
คุณเคยเห็นและลองแก้ไข TextBoxFor ของฉันมากเกินไปหรือไม่ - person Codebreaker007; 31.03.2020