แสดงเฉพาะวันที่และไม่มีเวลา


95

ในมีดโกน MVC ฉันใส่วันที่ปัจจุบันในฐานข้อมูลแบบนี้ ..

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

เนื่องจากฟิลด์ฐานข้อมูลเป็นประเภทข้อมูลวันที่และเวลาและฉันกำลังแปลงวันที่ปัจจุบันเป็นรูปแบบสตริงจึงไม่ทำงาน .. ฉันจะทำสิ่งนี้ได้อย่างไร ฉันกำลังทำรูปแบบสตริงเพราะฉันต้องการวันที่ในรูปแบบ mm / dd / yyyy และไม่ใช่ในรูปแบบ mm / dd / yyyy hh: mm: ss time ..

แก้ไข:

ในคอนโทรลเลอร์ฉันมี

var model = new ViewModel();
model.ReturnDate = DateTime.Now;            
return PartialView("PartialView", model);  

ใน partialview ฉันมี

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

นี่คือจุดที่แสดงวันที่เป็นวันที่และเวลาพร้อมกัน ... ฉันต้องการให้แสดงวันที่ ไม่ใช่เวลา. ฉันหวังว่าการแก้ไขนี้จะอธิบายได้ดีขึ้น


1
ไม่ต้องกังวลกับ 00:00:00 (เที่ยงคืน) เพียงแค่จัดรูปแบบผลลัพธ์ToString("mm/dd/yyyy");เพื่อให้สามารถเห็นสิ่งที่คุณต้องการ
Chase Florell

1
บันทึกข้อมูลในฐานข้อมูลเป็นDateTime. คุณจัดรูปแบบสตริงบน OUTPUT ... จัดรูปแบบไปยัง end viewer เท่านั้น
Chase Florell

คำตอบ:


98

หากประเภทคอลัมน์เป็น DateTime ใน SQL จะจัดเก็บเวลาที่คุณผ่านหรือไม่

ควรบันทึกวันที่อย่างถูกต้อง:

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 สำหรับประเภทของค่าที่คุณพยายามจะแสดง

เทมเพลต Editor เป็นวิธีที่ยอดเยี่ยมในการจัดการการควบคุมซ้ำ ๆ ใน MVC:

http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/

คุณสามารถใช้มันสำหรับประเภทไร้เดียงสาเช่น String ตามที่ฉันได้ทำไว้ข้างต้น แต่เหมาะอย่างยิ่งสำหรับการให้คุณสร้างชุดฟิลด์อินพุตสำหรับประเภทข้อมูลที่ซับซ้อนมากขึ้น


ไม่แน่ใจว่าใครลงคะแนนนี้ .. แต่ฉันไม่ได้ใช้ HTML.label เพื่อแสดงสิ่งนี้ฉันกำลังใช้ HTML.EditorFor (model => model.Returndate) ฉันจะจัดรูปแบบการแสดงผลในกรณีนี้ได้อย่างไร ...
ZVenue

นั่นเป็นเพียงตัวอย่างของวิธีจัดรูปแบบผลลัพธ์ของคุณ ฉันจะอัปเดตคำตอบของฉัน
Russ Clarke

ฉันคิดว่าถ้าค่ามีเหตุผลเป็นเพียงวันที่ก็ควรเก็บเฉพาะส่วนวันที่เช่นกันแม้ว่าเวลาจะถูกตัดออกบนหน้าจอก็ตาม
Jon Skeet

14
@Russ: ตัวแก้ไขสำหรับการอัปเดตที่คุณทำไม่ทำงาน มันทำให้ฉันมีข้อผิดพลาด "เทมเพลตสามารถใช้ได้เฉพาะกับการเข้าถึงฟิลด์การเข้าถึงคุณสมบัติดัชนีอาร์เรย์มิติเดียวหรือนิพจน์ตัวทำดัชนีที่กำหนดเองแบบพารามิเตอร์เดียว"
ZVenue

19
คุณควรลบ '@ Html.EditorFor (model => model.ReturnDate ToShortDateString ())' ออกจากคำตอบเนื่องจากไม่ได้ผล
James Reategui

132

เพียงแค่ต้องจัดการกับสถานการณ์นี้ด้วยตัวเอง - พบวิธีที่ง่ายมากในการทำเช่นนี้เพียงใส่คำอธิบายประกอบทรัพย์สินของคุณในแบบจำลองดังนี้:

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

มันจะซ่อนปุ่มเวลาจากตัวเลือกวันที่ด้วย

ขออภัยหากคำตอบนี้ช้าไปหน่อย;)


ขอบคุณมาก. มันเป็นโพสต์ที่มีประโยชน์มากสำหรับฉัน! +1
Dmytro

1
สิ่งที่ฉันต้องการ ยอดเยี่ยม!
RealityDysfunction

1
เมื่อเร็ว ๆ นี้ฉันมีสถานการณ์ที่โครเมี่ยมใส่สิ่งตลก ๆ เมื่อประเภทอินพุตเป็นวันที่ซึ่งเป็นส่วนหนึ่งของ html5 ฉันคิดว่าฉันต้องการใช้ jquery datepicker แทนดังนั้นฉันจึงไปกับ DataType.Text - นั่นยังอนุญาตให้ฉันใช้การจัดรูปแบบได้ดีพอ
John

2
ไม่จำเป็นต้องขอโทษที่มาสายการโพสต์คำตอบสำหรับคำถามเก่า ๆ อาจช่วยได้มากสำหรับผู้ที่ไม่ได้ OP นี่คือคำตอบที่ฉันกำลังมองหาเพราะฉันรู้ว่ามันเป็นไปได้ แต่จำไม่ได้ว่าเป็นอย่างไรและคุณโพสต์ไว้เมื่อ 3 ปีก่อน หากสิ่งใดที่คุณเหลือเชื่อในช่วงต้น
RyanfaeScotland

ถ้าวันที่มาจากฐานข้อมูลฉันไม่รู้ว่าจะช่วยได้อย่างไร ... คิดไม่ออก
Antoine Pelletier

41

ใช้งานได้หากคุณต้องการแสดงในกล่องข้อความ:

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

วันที่จะแสดงไม่ถูกต้องหากเบราว์เซอร์มีรูปแบบในการตั้งค่าที่แตกต่างจาก "dd-MM-yyyy" นั่นคือ "MM-dd-yyyy"
Oleg Sh

16

วันที่ / เวลาใน datebase จะไม่เป็นเวอร์ชันที่จัดรูปแบบเลย มันจะเป็นวันที่ / เวลาเอง วิธีที่คุณแสดงวันที่ / เวลานั้นเมื่อคุณดึงค่าจากฐานข้อมูลนั้นเป็นคนละเรื่องกัน ฉันสงสัยอย่างยิ่งว่าคุณต้องการแค่:

model.Returndate = DateTime.Now.Date;

หรืออาจเป็นไปได้

model.Returndate = DateTime.UtcNow.Date;

ใช่ถ้าคุณมองไปที่ฐานข้อมูลโดยใช้เซิร์ฟเวอร์สตูดิโอ SQL หรือสิ่งที่คุณจะได้ในขณะนี้ดูเที่ยงคืน - แต่ที่ไม่เกี่ยวข้องและเมื่อคุณดึงข้อมูลวันที่ออกจากฐานข้อมูลและแสดงให้กับผู้ใช้, จากนั้นคุณสามารถใช้รูปแบบที่เกี่ยวข้อง .

แก้ไข: สำหรับคำถามที่คุณแก้ไขปัญหาไม่ได้อยู่ที่โมเดล แต่เป็นวิธีที่คุณระบุมุมมอง คุณควรใช้สิ่งต่างๆเช่น:

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

ตัวระบุรูปแบบวันที่และเวลามาตรฐานdอยู่ที่ไหนสำหรับรูปแบบวันที่สั้น ๆ (ซึ่งหมายความว่ามันจะใช้การตั้งค่าทางวัฒนธรรมในปัจจุบันเข้าบัญชี)

นั่นคือบิตที่ฉันพูดซ้ำ ๆ - เมื่อคุณแสดงวันที่ / เวลาให้กับผู้ใช้นั่นคือเวลาที่จะจัดรูปแบบเป็นวันที่โดยไม่มีเวลา

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


DateTime.Now.Date ยังคงแสดงเวลาพร้อมกับวันที่
ZVenue

1
@ZVenue: แสดงที่ไหน? คุณควรจัดเก็บค่า DateTime และใช้ตัวระบุรูปแบบวันที่เท่านั้นทุกที่ที่คุณแสดงวันที่ รหัสที่คุณให้ไว้ (การตั้งค่าคุณสมบัติในโมเดล) นั้นน่าจะมีไว้สำหรับการจัดเก็บดังนั้นจึงไม่สำคัญว่าจะเป็นเวลาเที่ยงคืน
Jon Skeet

จอนแนะนำสิ่งที่ฉันกำลังพูดถึงบันทึกวันที่เป็น SQL ตามที่ระบุ จากนั้นคุณสามารถจัดรูปแบบวันที่ของคุณให้เหมาะสมเมื่อคุณพิมพ์
Russ Clarke

2
@ จอน: ฉันได้รับข้อผิดพลาดนี้เมื่อฉันใช้โค้ดแก้ไขของคุณสำหรับ html.editorfor .... "เทมเพลตสามารถใช้ได้เฉพาะกับการเข้าถึงฟิลด์การเข้าถึงคุณสมบัติดัชนีอาร์เรย์มิติเดียวหรือนิพจน์ตัวทำดัชนีที่กำหนดเองพารามิเตอร์เดียว" ... เวลาวิ่ง
ZVenue

1
@ZVenue: ดูสิ่งนี้ด้วย: stackoverflow.com/questions/5033902/…
Jon Skeet

8

คุณสามารถปรับเปลี่ยน ViewModel ของคุณได้ดังนี้:

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

โซลูชันนี้ยังช่วยแก้ปัญหาความขัดแย้งของ datepicker ของ Chrome หากคุณเพียงระบุ Datatype.Date ใน Viewmodel Chrome จะใช้ datepicker เวอร์ชันของตัวเองในกล่องข้อความ ขอขอบคุณ!
Katherine

7

คุณสามารถใช้รูปแบบวันเวลาที่กำหนดเองได้โดยใช้ ToString:

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

อ่านเพิ่มเติมเกี่ยวกับDateTime.ToStringรูปแบบรูปแบบได้ที่นี่และที่นี่ที่นี่

แก้ไข:หลังจากแก้ไขคำถามของคุณแล้วเช่นเดียวกับที่คนอื่น ๆ แนะนำคุณควรใช้รูปแบบวันที่ในมุมมองของคุณ:

model.Returndate = DateTime.Now.Date;

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

1
ซึ่งจะไม่ช่วยเรื่องการบันทึกวันที่
Russ Clarke

เขาบันทึกด้วยการโทรmodel.Returndate.ToString("mm/dd/yyyy")ไม่ได้หรือ?
Jalal กล่าว

นั่นเป็นปัญหา .. ฉันกำลังใส่ค่านั้นในฟิลด์วันที่และเวลาในฐานข้อมูล ดังนั้นจะไม่ได้ผล.. โปรดดูโพสต์ต้นฉบับของฉัน
ZVenue

ไม่ควรเป็น. ToString ("MM / dd / yyyy")? mm คือนาทีไม่ใช่เดือน!
Bodrick

@Bodrich: ขอบคุณอัปเดตฉันแค่คัดลอกวางรูปแบบของเขาแม้ว่า
Jalal กล่าว

4

ฉันไม่แน่ใจใน Razor แต่ใน ASPX คุณทำ:

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

ต้องมีบางอย่างที่คล้ายกันใน Razor หวังว่านี่จะช่วยใครบางคนได้


1
ใช่สิ่งนี้จะใช้ได้ในไวยากรณ์ของ Razor เช่น @ Html.Encode (string.Format ("0: D", item.Modify_Date))
Ciaran Gallagher

4

หากคุณมี for loop เช่นด้านล่าง

เปลี่ยน @ 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>

2

รวมคำอธิบายประกอบข้อมูลเช่น DisplayFormat และ ApplyFormatInEditMode เพื่อให้ได้ผลลัพธ์ที่ต้องการ

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

ตอนนี้วันที่เรียกเก็บเงินของคุณจะปรากฏขึ้น

ใส่คำอธิบายภาพที่นี่


โปรดดูคำตอบอื่น ๆ คุณคิดว่าของคุณมีความจำเป็นและเพิ่มเนื้อหาใหม่ ๆ ที่มีคุณภาพลงในโพสต์หรือไม่?
L. Guthardt

1

คุณสามารถแปลงวันที่และเวลา สิ่งที่ต้องการ:

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

1

ฉันมีปัญหากับวิธีแก้ปัญหาอื่น ๆ ในหน้านี้จึงคิดว่าจะทิ้งสิ่งนี้ไป

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

ดังนั้นคุณจะต้องเพิ่ม "{0: d}" ในพารามิเตอร์ที่สองเท่านั้นก็น่าจะดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.