Visualizza solo la data e non l'ora


91

In MVC razor, sto inserendo la data corrente nel database in questo modo ..

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

Poiché il campo del database è un tipo di dati datetime e sto convertendo la data corrente in formato stringa, non funziona .. come posso farlo? Sto usando il formato stringa perché voglio la data nel formato mm / gg / aaaa e non nel formato mm / gg / aaaa hh: mm: ss ora ..

MODIFICARE:

Nel controller ho

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

Nella visione parziale, ho

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

Qui è dove viene visualizzata la data come Data e Ora insieme ... Voglio che venga visualizzata solo la data. Non è il momento. Spero che questa modifica spieghi meglio.


1
non preoccuparti per le 00:00:00 (mezzanotte). Basta formattare l'output ToString("mm/dd/yyyy");per poter vedere esattamente quello che vuoi.
Chase Florell

1
Salva i dati nel database come DateTime. Esegui la formattazione delle stringhe su OUTPUT ... Formattalo solo per il visualizzatore finale.
Chase Florell

Risposte:


96

Se il tipo di colonna è DateTime in SQL, memorizzerà un'ora in cui ne passi una o meno.

Sarebbe meglio salvare la data correttamente:

model.ReturnDate = DateTime.Now;

e poi formattalo quando devi visualizzarlo:

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

O se stai usando EditorFor:

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

o

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

Per aggiungere una proprietà al tuo modello aggiungi questo codice:

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

Quindi nel tuo PartialView:

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

MODIFICARE:

Ciao ragazzi, voglio solo chiarire per questa risposta che, dicendo "Se stai usando EditorFor", significa che devi avere un modello EditorFor per il tipo di valore che stai cercando di rappresentare.

I modelli dell'editor sono un modo interessante per gestire i controlli ripetitivi in ​​MVC:

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

Puoi usarli per tipi ingenui come String come ho fatto sopra; ma sono particolarmente utili per consentirti di modellare un insieme di campi di input per un tipo di dati più complicato.


Non sono sicuro di chi abbia votato in basso .. ma non sto usando HTML.label per visualizzarlo .. Sto usando HTML.EditorFor (model => model.Returndate) come formatto il display in questo caso ...
ZVenue

Questo era solo un esempio di come formattare il risultato; Aggiornerò la mia risposta.
Russ Clarke

14
@Russ: l'editor per l'aggiornamento che hai fatto non ha funzionato. Viene visualizzato un errore "I modelli possono essere utilizzati solo con accesso ai campi, accesso alle proprietà, indice di matrice a una dimensione o espressioni dell'indicizzatore personalizzato a parametro singolo".
ZVenue

1
Lo aggiungerò alla mia risposta
Russ Clarke

19
dovresti rimuovere "@ Html.EditorFor (model => model.ReturnDate.ToShortDateString ())" dalla risposta perché non funziona.
James Reategui

129

Ho dovuto affrontare questo scenario da solo: ho trovato un modo davvero semplice per farlo, basta annotare la tua proprietà nel modello in questo modo:

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

Nasconderà anche il pulsante dell'ora dal selettore della data.

Scusa se questa risposta è un po 'in ritardo;)


Molte grazie. È stato un post molto utile per me! +1
Dmytro

1
Proprio quello di cui avevo bisogno. Eccellente!
RealityDysfunction

1
Recentemente ho avuto una posizione in cui chrome inseriva cose divertenti quando il tipo di input è data, parte di html5 penso, volevo usare jquery datepicker invece, quindi sono andato con DataType.Text - che mi ha comunque permesso di usare la formattazione abbastanza interessante
John

2
Non c'è bisogno di scusarsi per il ritardo, pubblicare risposte a vecchie domande può essere di grande aiuto per le persone che non sono OP. Questa è la risposta che stavo cercando perché sapevo che era possibile ma non riuscivo a ricordare come, e l'hai pubblicata 3 anni fa. Semmai sei incredibilmente in anticipo.
RyanfaeScotland

se la data proviene da un database non so come potrebbe aiutare ... non riesco a capirlo
Antoine Pelletier

41

Funziona se vuoi visualizzare in una casella di testo:

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

la data verrà visualizzata in modo errato se il browser ha un formato diverso nelle impostazioni rispetto a "gg-MM-aaaa", ad esempio "MM-gg-aaaa"
Oleg Sh

16

La data / ora nel database non sarà affatto una versione formattata . Sarà solo la data / ora stessa. Il modo in cui visualizzi quella data / ora quando estrai il valore dal database è una questione diversa. Sospetto fortemente che tu voglia solo:

model.Returndate = DateTime.Now.Date;

o forse

model.Returndate = DateTime.UtcNow.Date;

Sì, se si guarda al database utilizzando SQL Server Management Studio o qualsiasi altra cosa, sarà ora vedere la mezzanotte - ma questo è irrilevante, e quando si recupera la data di fuori della base di dati e visualizzare a un utente, quindi è possibile applicare il formato pertinente .

MODIFICA: per quanto riguarda la tua domanda modificata, il problema non è con il modello: è come specifichi la vista. Dovresti usare qualcosa come:

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

dove dè l' identificatore di formato di data e ora standard per il modello di data breve (il che significa che terrà conto delle impostazioni culturali correnti).

Questa è la parte che ho detto ripetutamente: che quando mostri la data / ora all'utente , è l'ora di formattarla come una data senza ora.

EDIT: Se questo non funziona, dovrebbe esserci un modo per decorare il modello o la vista con una stringa di formato o qualcosa del genere. Non sono davvero una persona MVC, ma sembra che dovrebbe esserci un buon modo per farlo in modo dichiarativo ...


DateTime.Now.Date mostra ancora l'ora insieme alla data.
ZVenue

1
@ZVenue: Visualizza dove? Dovresti memorizzare un valore DateTime e utilizzare un identificatore di formato di sola data ovunque tu stia visualizzando la data. Il codice che hai fornito (impostando una proprietà nel modello) è presumibilmente per l'archiviazione, quindi non importa che sia mezzanotte.
Jon Skeet

Jon sta suggerendo di cosa stavo parlando, salvando la data in SQL così com'è; puoi quindi formattare la data in modo appropriato quando la stampi.
Russ Clarke

2
@ Jon: ricevo questo errore quando ho utilizzato il codice di modifica per html.editorfor .... "I modelli possono essere utilizzati solo con accesso ai campi, accesso alle proprietà, indice di matrice monodimensionale o espressioni dell'indicizzatore personalizzato a parametro singolo". ... in fase di esecuzione
ZVenue

1
@ZVenue: dai un'occhiata anche a questo: stackoverflow.com/questions/5033902/…
Jon Skeet

8

Puoi modificare il tuo ViewModel come di seguito:

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

Questa soluzione risolve anche il problema del conflitto di datepicker di Chrome. Se specifichi solo Datatype.Date in Viewmodel, Chrome utilizza la propria versione di datepicker nella casella di testo. Grazie!
Katherine

7

Puoi applicare un formato di data e ora personalizzato utilizzando ToStringcome:

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

Ulteriori letture sui DateTime.ToStringformati pattern possono essere trovate qui e qui .

Modifica: dopo la modifica della domanda, proprio come gli altri suggeriscono di applicare il formato della data alla visualizzazione:

model.Returndate = DateTime.Now.Date;

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

1
questo però non aiuta il problema del salvataggio della data.
Russ Clarke

Non può salvarlo con la chiamata model.Returndate.ToString("mm/dd/yyyy")?
Jalal ha detto il

Quello è un problema. Sto mettendo quel valore in un campo datetime nel db. Quindi questo non funzionerà .. si prega di vedere il mio post originale.
ZVenue

Non dovrebbe essere .ToString ("MM / dd / yyyy")? mm sono minuti, non mesi!
Bodrick

@ Bodrich: grazie, aggiornato, copio solo incolla il suo schema però.
Jalal ha detto il

4

Non sono sicuro in Razor ma in ASPX lo fai:

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

Deve esserci qualcosa di simile in Razor. Si spera che questo aiuti qualcuno.


1
Sì, questo funzionerebbe anche con la sintassi Razor, ad esempio @ Html.Encode (string.Format ("0: D", item.Modify_Date))
Ciaran Gallagher

4

Se hai un ciclo for come quello qui sotto.

Cambia @ item.StartDate in @ item.StartDate.Value.ToShortDateString ()

Questo rimuoverà il tempo nel caso in cui non puoi annotare la tua proprietà nel modello come nel mio caso.

<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

Includere annotazioni dati come DisplayFormat e ApplyFormatInEditMode per ottenere l'output desiderato.

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

Ora la data del tuo conto apparirà come.

inserisci qui la descrizione dell'immagine


Si prega di dare un'occhiata alle altre risposte. Pensi che il tuo sia necessario e aggiunge al post alcuni nuovi contenuti di qualità?
L. Guthardt

1

Potresti semplicemente convertire il datetime. Qualcosa di simile a:

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

1

Ho avuto alcuni problemi con le altre soluzioni su questa pagina, quindi ho pensato di inserire questo.

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

Quindi devi solo aggiungere "{0: d}" nel secondo parametro e dovresti essere a posto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.