การแปลงรูปแบบ DateTime โดยใช้มีดโกน


104

มีอะไรผิดปกติต่อไปนี้?

@Convert.ToDateTime((@item.Date.ToShortDateString())," dd - M - yy")

@ item.Date กำลังแสดง 20/11/2005 00:00 น. อยากให้แสดง 20 พ.ย. 2554


1
การรวมกันของตัวระบุรูปแบบวันที่ต่างๆที่มีอยู่สามารถพบได้ที่นี่: msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
Joseph Woodward

คำตอบ:


265

ลอง:

@item.Date.ToString("dd MMM yyyy")

หรือคุณสามารถใช้[DisplayFormat]แอตทริบิวต์ในโมเดลมุมมองของคุณ:

[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")]
public DateTime Date { get; set }

และในมุมมองของคุณ:

@Html.DisplayFor(x => x.Date)

3
ฉันลองใช้กล่องข้อความและโชคไม่ดีที่มันไม่ได้ผล มีวิธีดำเนินการนี้สำหรับกล่องข้อความหรือไม่?
Tobias

2
สำหรับกล่องข้อความเพียงใช้ EditorFor แทน DisplayFor
Brandon シ Renfrow

10
อย่าลืมตั้งค่า "ApplyFormatInEditMode = true" ในนิยาม DisplayFormat ของคุณหากคุณต้องการให้ใช้การจัดรูปแบบวันที่กับองค์ประกอบ EditorFor ()
Latedeveloper

1
ฉันจำเป็นต้องใช้สิ่งนี้สำหรับฟิลด์ DateTime เพื่อใช้ตัวเลือกวันที่ในตัว หากไม่มีคำอธิบายประกอบ DisplayFormat คอนโซล javascript ในเบราว์เซอร์จะแสดงบางอย่างเช่น "ค่าที่ระบุ" 1/1/1990 00:00:00 "ไม่เป็นไปตามรูปแบบที่ต้องการ" yyyy-MM-dd "" ฉันต้องตั้งค่าทั้ง DataFormatString และตั้งค่า ApplyFormatInEditMode เป็นจริงเพื่อให้ข้อผิดพลาดหายไปและค่าจะแสดงอย่างถูกต้องเมื่อใช้ EditorFor ในมุมมอง MVC ของฉัน
มาร์ค

สิ่งนี้ใช้ได้ผลสำหรับฉัน แต่ฉันไม่รู้ - ฉันรู้สึกว่าฉันละเมิดการแยกข้อกังวลโดยใช้ตรรกะในการจัดรูปแบบวันที่ (ข้อกังวลในการนำเสนอ) ในโมเดลผ่านแอตทริบิวต์ ฉันเข้าใจว่านี่เป็นวิธีที่ Microsoft คาดหวังให้ใช้งานได้ แต่ดูเหมือนว่าการจัดรูปแบบการแสดงข้อมูลควรแยกออกจากมุมมองและโมเดลควรเป็นแบบจำลอง
barrypicker

73

นี่คือวิธีแก้ปัญหา:

@item.Published.Value.ToString("dd. MM. yyyy")

ก่อนToString ()ใช้ราคา


1
รหัสนี้ถูกต้อง แต่ถ้าคอลัมน์วันที่เป็นโมฆะสิ่งนี้จะทำให้เกิดข้อผิดพลาดดังนั้นลองทำเช่นนี้
shaijut

Stom ถูกต้องถ้าคุณมีค่า null จะทำให้คุณเกิดข้อผิดพลาดขอบคุณสำหรับลิงค์
Nick Kahn

แค่สิ่งที่ฉันกำลังมองหา
Roger Tello

ยกเว้น Null สามารถจัดการได้โดยใช้ประกอบ null coalescing @(item.DOB?.ToString("dd-MMM-yyyy"))- หรือโดยใช้ทรัพย์สิน HasValue @(item.DataDate.HasValue ? item.DataDate.Value.Date.ToString("dd MMM yyyy") : null)- ในทั้งสองกรณีคุณสมบัติต้องเป็นวันที่และเวลาที่เป็นโมฆะ
quasar

31

ลองใช้ใน MVC 4.0

@Html.TextBoxFor(m => m.YourDate, "{0:dd/MM/yyyy}", new { @class = "datefield form-control", @placeholder = "Enter start date..." })

2
ฉันไม่รู้ว่าทำไมใคร ๆ ถึงลงคะแนนคำตอบนี้
Mikayil Abdullayev

ฉันจะถือว่าการโหวตลดลงเกิดจากการที่โซลูชันนี้จัดรูปแบบวันที่เป็น "dd / MM / yyyy" แทนที่จะเป็นรูปแบบ "dd MMM yyyy" ที่ OP ร้องขอ
PTD

1
อันนี้น่าจะเป็นคำตอบที่เลือก ฉันลองอย่างอื่นแล้วไม่มีผล ขอบคุณ.
Victor Lee

20

แอตทริบิวต์ [DisplayFormat] ถูกใช้ใน EditorFor / DisplayFor เท่านั้นไม่ใช่โดย HTML APIs ดิบเช่น TextBoxFor ฉันทำให้มันใช้งานได้โดยทำสิ่งต่อไปนี้

รุ่น:

[Display(Name = "When was that document issued ?")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime? LiquorLicenceDocumentIssueDate { get; set; }

ดู:

        <div id="IsLiquorLicenceDocumentOnPremisesYes" class="groupLongLabel">
            @Html.LabelFor(m => m.LiquorLicenceDocumentIssueDate)
            <span class="indicator"></span>
            @Html.EditorFor(m => m.LiquorLicenceDocumentIssueDate)
            <span id="validEmail"></span>
            <br />
            @Html.ValidationMessageFor(m => m.LiquorLicenceDocumentIssueDate)
        </div>

เอาท์พุท: 30/12/2554

ลิงค์ที่เกี่ยวข้อง:

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.applyformatineditmode.aspx


1
หรือคุณสามารถใช้ @ string.Format ("{0: MM yyyy}", imprint.VersionDate)
Diganta Kumar


4

สำหรับ Razor ให้ใส่ไฟล์ DateTime.cshtml ในโฟลเดอร์ Views / Shared / EditorTemplates DateTime.cshtml มีสองบรรทัดและสร้างกล่องข้อความที่มีรูปแบบวันที่ 9/11/2001

@model DateTime?
@Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" })

1
ขอบคุณ ... ไม่สามารถให้คนอื่นทำงานได้ C # / Razor เปลี่ยนไปมากขนาดนั้นหรือไม่ที่รูปแบบวันที่ที่เรียบง่ายต้องผ่านหลายสิ่งหลายอย่างในการทำงาน? คำตอบที่แนะนำมากที่สุดบนอินเทอร์เน็ต: .... ToString ("dd MMM yyyy") ไม่เคยได้ผลสำหรับฉันและฉันมักจะลงเอยด้วยการยัดมันลงในตัวแปรแปลงเป็นวันที่จากนั้นจึงแสดงผลวันที่ ฉันรู้ว่าต้องมีซับหนึ่งตัวที่ทำงานที่ไหนสักแห่ง
Anthony Griggs

Anthony Griggs ฉันรู้สึกว่าใช่ ดีใจที่ได้แบ่งปันความเจ็บปวดเพื่อที่เราทุกคนจะได้รับ--6½ปีต่อมา!
Jules Bartow

3

โดยทั่วไปเดือนที่เขียนจะใช้ Escape เป็น MMM ปี 4 หลักเป็นปปปปดังนั้นสตริงรูปแบบของคุณควรมีลักษณะเป็น "dd MMM yyyy"

DateTime.ToString("dd MMM yyyy")

@ ViewBag.PurchaseInfo.LastPurchaseTime ToString ("dd.MM.yyyy")
yonexbat

3

ฉันไม่สามารถทำงานนี้ได้ทั้งหมดตามคำแนะนำข้างต้น การรวม DataTypeAttribute [DataType(DataType.Date)]ดูเหมือนจะช่วยแก้ปัญหาของฉันได้โปรดดู:

รุ่น

[Required]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public DateTime RptDate { get; set; }

ดู

@Html.EditorFor(m => m.CLPosts.RptDate)

HTH


1

สำหรับวิธีการแก้ปัญหาทั้งหมดเมื่อคุณลองใช้ในเบราว์เซอร์รุ่นใหม่ (เช่น FF) และคุณได้ตั้งค่ารุ่นที่ถูกต้อง

// Model
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
public DateTime Start { get; set; }

// View
<div class="form-group">
    @Html.LabelFor(model => model.Start, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Start, "{0:dd-MM-yyyy}", new { htmlAttributes = new { @class = "form-control"} })
    </div>
</div>

mvc (5) จะแสดงผล ( ประเภทของอินพุตถูกตั้งค่าเป็นวันที่ตามการตั้งค่าวันที่ของคุณในรุ่นของคุณ!)

<div class="col-md-10">
<input class="form-control text-box single-line" data-val="true" data-val-date="The field Start must be a date." data-val-required="The Start field is required." id="Start" name="Start" value="01-05-2018" type="date">
        <span class="field-validation-valid text-danger" data-valmsg-for="Start" data-valmsg-replace="true"></span>
</div>

และเบราว์เซอร์จะแสดง

ป้อนคำอธิบายภาพที่นี่

ในการแก้ไขปัญหานี้คุณต้องเปลี่ยนประเภทเป็นข้อความแทนวันที่ (เช่นถ้าคุณต้องการใช้ปฏิทินที่กำหนดเอง)

@Html.EditorFor(model => model.Start, "{0:dd-MM-yyyy}", new { htmlAttributes = new { @class = "form-control", @type = "text" } })
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.