Nur Datum und keine Uhrzeit anzeigen

91

In MVC Razor stelle ich das aktuelle Datum wie folgt in die Datenbank.

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

Da das Datenbankfeld ein Datetime-Datentyp ist und ich das aktuelle Datum in das Zeichenfolgenformat konvertiere, funktioniert dies nicht. Wie kann ich das tun? Ich mache das String-Format, weil ich das Datum im Format MM / TT / JJJJ und nicht im Format MM / TT / JJJJ HH: MM: SS-Zeitformat haben möchte.

BEARBEITEN:

In der Steuerung habe ich

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

In der Teilansicht habe ich

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

Hier wird das Datum als Datum und Uhrzeit zusammen angezeigt. Ich möchte, dass nur das Datum angezeigt wird. Nicht die Zeit. Ich hoffe, diese Bearbeitung erklärt besser.

ZVenue
quelle
1
Mach dir keine Sorgen um 00:00:00 (Mitternacht). Formatieren Sie einfach die Ausgabe ToString("mm/dd/yyyy");, um genau zu sehen, was Sie wollen.
Chase Florell
1
Speichern Sie die Daten in der Datenbank unter DateTime. Sie führen die Formatierung der Zeichenfolge im OUTPUT durch ... Formatieren Sie sie nur für den End-Viewer.
Chase Florell

Antworten:

96

Wenn der Spaltentyp in SQL DateTime ist, wird eine Zeit gespeichert, zu der Sie eine übergeben oder nicht.

Es ist besser, das Datum richtig zu speichern:

model.ReturnDate = DateTime.Now;

und formatieren Sie es dann, wenn Sie es anzeigen müssen:

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

Oder wenn Sie EditorFor verwenden:

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

oder

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

Um Ihrem Modell eine Eigenschaft hinzuzufügen, fügen Sie diesen Code hinzu:

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

Dann in Ihrer PartialView:

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

BEARBEITEN:

Hallo Leute, möchte für diese Antwort nur klarstellen, dass ich mit "Wenn Sie EditorFor verwenden" eine EditorFor-Vorlage für den Werttyp benötige, den Sie darstellen möchten.

Editor-Vorlagen sind eine coole Möglichkeit, sich wiederholende Steuerelemente in MVC zu verwalten:

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

Sie können sie für naive Typen wie String verwenden, wie ich es oben getan habe. Sie eignen sich jedoch besonders gut, um eine Reihe von Eingabefeldern für einen komplizierteren Datentyp zu erstellen.

Russ Clarke
quelle
Ich bin mir nicht sicher, wer dies abgelehnt hat. Aber ich verwende das HTML.Label nicht, um dies anzuzeigen. Ich verwende HTML.EditorFor (model => model.Returndate). Wie formatiere ich die Anzeige in diesem Fall
?
Dies war nur ein Beispiel für die Formatierung Ihres Ergebnisses. Ich werde meine Antwort aktualisieren.
Russ Clarke
14
@Russ: Der von Ihnen vorgenommene Editor für das Update hat nicht funktioniert. Es gibt mir einen Fehler "Vorlagen können nur mit Feldzugriff, Eigenschaftszugriff, eindimensionalem Array-Index oder benutzerdefinierten Indexerausdrücken mit einzelnen Parametern verwendet werden."
ZVenue
1
Ich werde es meiner Antwort hinzufügen
Russ Clarke
19
Sie sollten '@ Html.EditorFor (model => model.ReturnDate.ToShortDateString ())' aus der Antwort entfernen, da dies nicht funktioniert.
James Reategui
129

Ich musste mich nur selbst mit diesem Szenario befassen - habe einen wirklich einfachen Weg gefunden, dies zu tun. Kommentieren Sie einfach Ihre Immobilie im Modell wie folgt:

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

Dadurch wird auch die Zeitschaltfläche vor der Datumsauswahl ausgeblendet.

Entschuldigung, wenn diese Antwort etwas spät ist;)

Fauler Dave
quelle
Vielen Dank. Es war ein sehr hilfreicher Beitrag für mich! +1
Dmytro
1
Genau das, was ich brauchte. Ausgezeichnet!
RealityDysfunction
1
Ich hatte kürzlich eine Sitation, in der Chrome lustige Dinge einfügte, wenn der Eingabetyp das Datum ist, ein Teil von HTML5. Ich glaube, ich wollte stattdessen jquery datepicker verwenden, also entschied ich mich für DataType.Text - das erlaubte mir immer noch, die Formatierung cool genug zu verwenden
John
2
Sie müssen sich nicht für Verspätungen entschuldigen. Das Posten von Antworten auf alte Fragen kann eine große Hilfe für Menschen sein, die nicht in Betrieb sind. Dies ist die Antwort, nach der ich gesucht habe, da ich wusste, dass es möglich ist, mich aber nicht erinnern kann, wie, und Sie haben es vor 3 Jahren gepostet. Wenn überhaupt, bist du unglaublich früh.
RyanfaeScotland
Wenn das Datum aus einer Datenbank stammt, weiß ich nicht, wie dies helfen könnte ... kann es nicht herausfinden
Antoine Pelletier
41

Dies funktioniert, wenn Sie in einer TextBox anzeigen möchten:

@Html.TextBoxFor(m => m.Employee.DOB, "{0:dd-MM-yyyy}")
Brij
quelle
Das Datum wird falsch angezeigt, wenn der Browser in den Einstellungen ein anderes Format als "TT-MM-JJJJ" hat, dh "MM-TT-JJJJ"
Oleg Sh
16

Das Datum / die Uhrzeit in der Datumsbasis ist überhaupt keine formatierte Version. Es wird nur das Datum / die Uhrzeit selbst sein. Anders ist es, wie Sie dieses Datum und diese Uhrzeit anzeigen , wenn Sie den Wert aus der Datenbank extrahieren. Ich vermute sehr, dass Sie wirklich nur wollen:

model.Returndate = DateTime.Now.Date;

oder möglicherweise

model.Returndate = DateTime.UtcNow.Date;

Ja, wenn Sie in der Datenbank suchen mithilfe von SQL Server Studios oder was auch immer, werden Sie jetzt Mitternacht sehen - aber das ist irrelevant, und wenn Sie das Datum der Datenbank holen und es an einen Benutzer anzuzeigen, dann können Sie das entsprechende Format anwenden .

BEARBEITEN: In Bezug auf Ihre bearbeitete Frage liegt das Problem nicht beim Modell, sondern bei der Angabe der Ansicht. Sie sollten etwas verwenden wie:

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

Wo dist der Standard-Datums- und Zeitformatbezeichner für das kurze Datumsmuster (was bedeutet, dass die aktuellen kulturellen Einstellungen berücksichtigt werden)?

Das habe ich wiederholt gesagt: Wenn Sie dem Benutzer Datum und Uhrzeit anzeigen , ist dies die Zeit, um es als Datum ohne Uhrzeit zu formatieren.

BEARBEITEN: Wenn dies nicht funktioniert, sollte es eine Möglichkeit geben, das Modell oder die Ansicht mit einer Formatzeichenfolge zu dekorieren - oder so ähnlich. Ich bin nicht wirklich eine MVC-Person, aber es scheint , dass es einen guten Weg geben sollte, dies deklarativ zu tun ...

Jon Skeet
quelle
Das DateTime.Now.Date zeigt weiterhin die Uhrzeit zusammen mit dem Datum an.
ZVenue
1
@ZVenue: Zeigt es wo an? Sie sollten einen DateTime-Wert speichern und überall dort, wo Sie das Datum anzeigen, einen Nur-Datum-Formatbezeichner verwenden . Der Code, den Sie angegeben haben (Festlegen einer Eigenschaft im Modell), dient vermutlich der Speicherung. Es spielt also keine Rolle, dass es Mitternacht ist.
Jon Skeet
Jon schlägt vor, worüber ich gesprochen habe, und speichert das Datum in SQL, wie es ist. Sie können Ihr Datum dann beim Drucken einfach entsprechend formatieren.
Russ Clarke
2
@Jon: Ich erhalte diesen Fehler, wenn ich Ihren Bearbeitungscode für html.editorfor .... verwendet habe. "Vorlagen können nur mit Feldzugriff, Eigenschaftszugriff, eindimensionalem Array-Index oder benutzerdefinierten Indexerausdrücken mit einzelnen Parametern verwendet werden." ... zur Laufzeit
ZVenue
1
@ ZVenue: Schauen Sie sich auch das an: stackoverflow.com/questions/5033902/…
Jon Skeet
8

Sie können Ihr ViewModel wie folgt ändern:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",ApplyFormatInEditMode = true)]
Ishant Sitaula
quelle
Diese Lösung löst auch das Problem des Datepicker-Konflikts in Chrome. Wenn Sie in Viewmodel nur Datatype.Date angeben, verwendet Chrome eine eigene Version von datepicker im Textfeld. Danke dir!
Katherine
7

Sie können das benutzerdefinierte Datums- und Uhrzeitformat ToStringwie folgt anwenden :

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

Weitere Informationen zum DateTime.ToStringFormatmuster finden Sie hier und hier .

Bearbeiten: Nach der Bearbeitung Ihrer Frage sollten Sie genau wie von anderen vorgeschlagen das Datumsformat in Ihrer Ansicht anwenden:

model.Returndate = DateTime.Now.Date;

@Html.EditorFor(model => model.Returndate.Date.ToString("MM/dd/yyyy"))
Jalal sagte
quelle
1
Das hilft jedoch nicht beim Speichern des Datums.
Russ Clarke
Kann er es nicht mit einem Anruf retten model.Returndate.ToString("mm/dd/yyyy")?
Jalal sagte
Das ist ein Problem. Ich setze diesen Wert in ein Datum / Uhrzeit-Feld in der Datenbank. Das wird also nicht funktionieren. Bitte sehen Sie meinen ursprünglichen Beitrag.
ZVenue
Sollte es nicht .ToString ("MM / TT / JJJJ") sein? mm ist Minuten, nicht Monate!
Bodrick
@Bodrich: danke, aktualisiert, ich kopiere aber füge sein Muster ein.
Jalal sagte
4

Ich bin mir in Razor nicht sicher, aber in ASPX tun Sie Folgendes:

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

Es muss etwas Ähnliches in Razor geben. Hoffentlich hilft das jemandem.

G Jeny Ramirez
quelle
1
Ja, dies würde auch in der Razor-Syntax funktionieren, z. B. @ Html.Encode (string.Format ("0: D", item.Modify_Date))
Ciaran Gallagher,
4

Wenn Sie eine for-Schleife wie die folgende haben.

Ändern Sie @ item.StartDate in @ item.StartDate.Value.ToShortDateString ()

Dadurch wird die Zeit entfernt, falls Sie Ihre Eigenschaft im Modell nicht wie in meinem Fall mit Anmerkungen versehen können.

<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>
Apollo
quelle
2

Fügen Sie Datenanmerkungen wie DisplayFormat und ApplyFormatInEditMode hinzu, um die gewünschte Ausgabe zu erhalten.

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

Jetzt wird Ihr Rechnungsdatum wie angezeigt.

Geben Sie hier die Bildbeschreibung ein

Pradip Rupareliya
quelle
Bitte schauen Sie sich die anderen Antworten an. Denken Sie, dass Ihre notwendig sind und fügen Sie dem Beitrag einige neue Qualitätsinhalte hinzu?
L. Guthardt
1

Sie können einfach die datetime konvertieren. Etwas wie:

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

Ich hatte einige Probleme mit den anderen Lösungen auf dieser Seite und dachte, ich würde das hier lesen.

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

Sie müssen also nur "{0: d}" in den zweiten Parameter einfügen und können loslegen.

Lee
quelle