Tampilkan hanya tanggal dan tidak ada waktu


94

Di pisau cukur MVC, saya memasukkan tanggal saat ini di database seperti ini ..

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

Karena bidang database adalah tipe data waktu dan saya mengubah tanggal saat ini ke format string, ini tidak berfungsi .. bagaimana saya bisa melakukan ini? Saya melakukan format string karena saya ingin tanggal dalam format hh / bb / tttt dan bukan dalam format hh / bb / tttt jj: mm: dd format waktu ..

EDIT:

Di pengontrol yang saya miliki

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

Dalam pandangan parsial, saya punya

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

Di sinilah yang menampilkan tanggal sebagai Tanggal dan Waktu bersama-sama ... Saya hanya ingin tanggal yang ditampilkan. Bukan waktunya. Saya harap hasil edit ini menjelaskan lebih baik.


1
jangan khawatir tentang 00:00:00 (tengah malam). Cukup format hasilnya ToString("mm/dd/yyyy");agar dapat melihat dengan tepat apa yang Anda inginkan.
Mengejar Florell

1
Simpan data dalam database sebagai DateTime. Anda melakukan pemformatan string pada OUTPUT ... Hanya memformatnya ke penampil akhir.
Mengejar Florell

Jawaban:


97

Jika tipe kolom adalah DateTime dalam SQL maka itu akan menyimpan waktu di mana Anda melewatkan satu atau tidak.

Akan lebih baik untuk menyimpan tanggal dengan benar:

model.ReturnDate = DateTime.Now;

lalu format saat Anda perlu menampilkannya:

@Html.Label(Model.ReturnDate.ToShortDateString())

Atau jika Anda menggunakan EditorFor:

@Html.EditorFor(model => model.ReturnDate.ToShortDateString())

atau

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

Untuk menambahkan properti ke model Anda, tambahkan kode ini:

public string ReturnDateForDisplay
{
    get
    {
       return this.ReturnDate.ToString("d");
    }
}

Kemudian di PartialView Anda:

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

EDIT:

Hai teman-teman, hanya ingin menjelaskan jawaban ini bahwa dengan mengatakan 'Jika Anda menggunakan EditorFor', itu berarti Anda harus memiliki template EditorFor untuk jenis nilai yang Anda coba wakili.

Template editor adalah cara keren untuk mengelola kontrol berulang di MVC:

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

Anda dapat menggunakannya untuk tipe naif seperti String seperti yang telah saya lakukan di atas; tapi mereka sangat bagus untuk memungkinkan Anda membuat template sekumpulan bidang input untuk tipe data yang lebih rumit.


tidak yakin siapa yang menurunkan suara ini .. tetapi saya tidak menggunakan label HTML untuk menampilkan ini .. Saya menggunakan HTML.EditorFor (model => model.Returndate) bagaimana cara memformat tampilan dalam kasus ini ...
ZVenue

Itu hanya contoh bagaimana memformat hasil Anda; Saya akan memperbarui jawaban saya.
Russ Clarke

14
@Russ: editor untuk pembaruan yang Anda buat tidak berfungsi. Ini memberi saya kesalahan "Kerangka hanya dapat digunakan dengan akses bidang, akses properti, indeks larik dimensi tunggal, atau ekspresi pengindeks khusus parameter tunggal".
ZVenue

1
Saya akan menambahkannya ke jawaban saya
Russ Clarke

19
Anda harus menghapus '@ Html.EditorFor (model => model.ReturnDate.ToShortDateString ())' dari jawaban karena itu tidak berhasil.
James Reategui

131

Hanya harus menangani sendiri skenario ini - temukan cara yang sangat mudah untuk melakukannya, cukup beri anotasi pada properti Anda dalam model seperti ini:

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

Ini akan menyembunyikan tombol waktu dari pemilih tanggal juga.

Maaf jika jawaban ini agak terlambat;)


Terima kasih banyak. Itu adalah posting yang sangat membantu saya! +1
Dmytro

1
Hanya apa yang saya butuhkan. Luar biasa!
RealityDysfunction

1
Saya memiliki situasi baru-baru ini di mana chrome memasukkan hal-hal lucu ketika tipe input adalah tanggal, bagian dari html5 saya pikir, saya ingin menggunakan jquery datepicker sebagai gantinya jadi saya menggunakan DataType.Text - yang masih memungkinkan saya untuk menggunakan format yang cukup keren
John

2
Tidak perlu meminta maaf karena terlambat, memposting jawaban atas pertanyaan lama bisa sangat membantu orang yang tidak OP. Ini adalah jawaban yang saya cari karena saya tahu itu mungkin tetapi tidak dapat mengingat caranya, dan Anda mempostingnya 3 tahun yang lalu. Jika ada, Anda sangat awal.
RyanfaeScotland

jika tanggalnya berasal dari database saya tidak tahu bagaimana ini bisa membantu ... tidak bisa mengetahuinya
Antoine Pelletier

41

Ini berfungsi jika Anda ingin menampilkan dalam TextBox:

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

tanggal akan ditampilkan secara tidak benar jika browser memiliki format yang berbeda dalam pengaturan dari "hh-BB-tttt", yaitu "BB-hh-tttt"
Oleg Sh

16

Tanggal / waktu dalam basis data tidak akan menjadi versi yang diformat sama sekali. Itu hanya akan menjadi tanggal / waktu itu sendiri. Bagaimana Anda menampilkan tanggal / waktu ketika Anda mengekstrak nilai dari database adalah masalah yang berbeda. Saya sangat curiga Anda benar-benar hanya ingin:

model.Returndate = DateTime.Now.Date;

atau mungkin

model.Returndate = DateTime.UtcNow.Date;

Ya, jika Anda melihat database menggunakan SQL Server Studio atau apa pun, Anda akan sekarang melihat tengah malam - tapi itu tidak relevan, dan ketika Anda mengambil tanggal dari database dan menampilkannya kepada pengguna, maka Anda dapat menerapkan format yang relevan .

EDIT: Sehubungan dengan pertanyaan yang Anda edit, masalahnya bukan pada modelnya - melainkan bagaimana Anda menentukan tampilan. Anda harus menggunakan sesuatu seperti:

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

di mana dadalah tanggal dan waktu format standar specifier untuk pola tanggal pendek (yang berarti akan mengambil setting budaya saat ini ke account).

Itulah sedikit yang telah saya katakan berulang kali - bahwa ketika Anda menampilkan tanggal / waktu kepada pengguna , itulah waktu untuk memformatnya sebagai tanggal tanpa waktu.

EDIT: Jika ini tidak berhasil, harus ada cara mendekorasi model atau tampilan dengan string format - atau sesuatu seperti itu. Saya sebenarnya bukan orang MVC, tapi rasanya harus ada cara yang baik untuk melakukan ini secara deklaratif ...


DateTime.Now.Date masih menampilkan waktu bersama dengan tanggal.
ZVenue

1
@ZVenue: Menampilkannya di mana? Anda harus menyimpan nilai DateTime, dan menggunakan penentu format khusus tanggal di mana pun Anda menampilkan tanggal. Kode yang Anda berikan (menyetel properti dalam model) mungkin untuk penyimpanan, jadi tidak masalah jika ada waktu tengah malam.
Jon Skeet

Jon menyarankan apa yang saya bicarakan, menyimpan tanggal ke SQL sebagaimana aslinya; Anda kemudian dapat memformat tanggal Anda dengan tepat saat Anda mencetaknya.
Russ Clarke

2
@Jon: Saya mendapatkan kesalahan ini ketika saya menggunakan kode edit Anda untuk html.editorfor .... "Template hanya dapat digunakan dengan akses bidang, akses properti, indeks larik dimensi tunggal, atau ekspresi pengindeks khusus parameter tunggal". ... pada waktu berjalan
ZVenue


8

Anda dapat memodifikasi ViewModel Anda seperti di bawah ini:

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

Solusi ini juga memecahkan masalah konflik pemilih data Chrome. Jika Anda baru saja menentukan Datatype.Date di Viewmodel, Chrome menggunakan versi datepicker-nya sendiri di kotak teks. Terima kasih!
Katherine

7

Anda dapat menerapkan format waktu tanggal khusus menggunakan ToStringseperti:

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

Bacaan lebih lanjut tentang DateTime.ToStringpola format dapat ditemukan di sini dan di sini .

Edit: Setelah pertanyaan Anda diedit, Seperti yang disarankan orang lain, Anda harus menerapkan format tanggal pada tampilan Anda:

model.Returndate = DateTime.Now.Date;

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

1
itu tidak akan membantu masalah menyimpan tanggal sekalipun.
Russ Clarke

Tidak bisakah dia menyimpannya dengan menelepon model.Returndate.ToString("mm/dd/yyyy")?
Jalal Said

Itu masalah .. Saya meletakkan nilai itu di bidang datetime di db. Jadi ini tidak akan berhasil .. silakan lihat posting asli saya.
ZVenue

Bukankah seharusnya .ToString ("MM / dd / yyyy")? mm adalah menit, bukan bulan!
Bodrick

@Bodrich: terima kasih, diperbarui, saya hanya menyalin dan menempel polanya.
Jalal Said

4

Saya tidak yakin di Razor tetapi di ASPX Anda melakukan:

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

Pasti ada yang mirip di Razor. Semoga ini bisa membantu seseorang.


1
Ya, ini juga akan berfungsi dalam sintaks Razor, misalnya @ Html.Encode (string.Format ("0: D", item.Modify_Date))
Ciaran Gallagher

4

Jika Anda memiliki loop for seperti di bawah ini.

Ubah @ item.StartDate menjadi @ item.StartDate.Value.ToShortDateString ()

Ini akan menghapus waktu kalau-kalau Anda tidak dapat membuat anotasi properti Anda dalam model seperti dalam kasus saya.

<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

Sertakan Anotasi Data seperti DisplayFormat dan ApplyFormatInEditMode untuk mendapatkan keluaran yang diinginkan.

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

Sekarang tanggal Bill Anda akan menunjukkan seperti.

masukkan deskripsi gambar di sini


Silakan lihat jawaban lainnya. Apakah menurut Anda milik Anda diperlukan dan menambahkan beberapa konten berkualitas baru ke pos?
L. Guthardt

1

Anda cukup mengonversi datetime. Sesuatu seperti:

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

1

Saya memiliki beberapa masalah dengan solusi lain di halaman ini, jadi saya pikir saya akan menghentikannya.

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

Jadi, Anda hanya perlu menambahkan "{0: d}" di parameter kedua dan Anda sudah siap.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.