Afficher uniquement la date et aucune heure


91

Dans le rasoir MVC, je mets la date actuelle dans la base de données comme ceci.

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

Puisque le champ de base de données est un type de données datetime et que je convertis la date actuelle au format chaîne, cela ne fonctionne pas. Comment puis-je faire cela? Je fais le format de chaîne parce que je veux la date au format mm / jj / aaaa et non au format mm / jj / aaaa hh: mm: ss.

ÉDITER:

Dans le contrôleur j'ai

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

Dans la vue partielle, j'ai

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

C'est là qu'il affiche la date en tant que date et heure ensemble ... Je veux juste que la date soit affichée. Pas le temps. J'espère que cette modification explique mieux.


1
ne vous inquiétez pas pour le 00:00:00 (minuit). Formatez simplement la sortie ToString("mm/dd/yyyy");pour pouvoir voir exactement ce que vous voulez.
Chase Florell

1
Enregistrez les données dans la base de données sous DateTime. Vous effectuez la mise en forme de la chaîne sur la SORTIE ... Formatez-la uniquement vers le visualiseur final.
Chase Florell

Réponses:


96

Si le type de colonne est DateTime en SQL, il stockera une heure à laquelle vous en transmettez une ou non.

Il vaudrait mieux enregistrer la date correctement:

model.ReturnDate = DateTime.Now;

puis formatez-le lorsque vous avez besoin de l'afficher:

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

Ou si vous utilisez EditorFor:

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

ou

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

Pour ajouter une propriété à votre modèle, ajoutez ce code:

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

Puis dans votre PartialView:

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

ÉDITER:

Salut les gars, je veux juste clarifier pour cette réponse qu'en disant `` Si vous utilisez EditorFor '', cela signifie que vous devez avoir un modèle EditorFor pour le type de valeur que vous essayez de représenter.

Les modèles d'éditeur sont un moyen intéressant de gérer les contrôles répétitifs dans MVC:

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

Vous pouvez les utiliser pour des types naïfs comme String comme je l'ai fait ci-dessus; mais ils sont particulièrement utiles pour vous permettre de modéliser un ensemble de champs d'entrée pour un type de données plus compliqué.


je ne sais pas qui a voté contre cela .. mais je n'utilise pas le HTML.label pour l'afficher .. J'utilise HTML.EditorFor (model => model.Returndate) comment formater l'affichage dans ce cas ...
ZVenue

C'était juste un exemple de la façon de formater votre résultat; Je mettrai à jour ma réponse.
Russ Clarke

14
@Russ: l'éditeur de la mise à jour que vous avez effectuée n'a pas fonctionné. Cela me donne une erreur "Les modèles ne peuvent être utilisés qu'avec l'accès aux champs, l'accès aux propriétés, les index de tableau à une dimension ou les expressions d'indexation personnalisées à paramètre unique."
ZVenue

1
Je l'ajouterai à ma réponse
Russ Clarke

19
vous devez supprimer '@ Html.EditorFor (model => model.ReturnDate.ToShortDateString ())' de la réponse car cela ne fonctionne pas.
James Reategui

129

J'ai juste eu à gérer ce scénario moi-même - j'ai trouvé un moyen très simple de le faire, annotez simplement votre propriété dans le modèle comme ceci:

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

Il masquera également le bouton d'heure du sélecteur de date.

Désolé si cette réponse est un peu tardive;)


Merci beaucoup. C'était un message très utile pour moi! +1
Dmytro

1
Juste ce dont j'avais besoin. Excellent!
RealityDysfunction

1
J'ai récemment eu une sitation où chrome a mis des choses amusantes lorsque le type d'entrée est la date, une partie de html5 je pense, je voulais utiliser jquery datepicker à la place, alors je suis allé avec DataType.Text - cela m'a quand même permis d'utiliser le formatage assez cool
John

2
Inutile de vous excuser d'être en retard, poster des réponses à d'anciennes questions peut être d'une grande aide pour les personnes qui ne sont pas OP. C'est la réponse que je cherchais car je savais que c'était possible mais je ne me souvenais pas comment, et vous l'avez postée il y a 3 ans. Si quoi que ce soit, vous êtes incroyablement tôt.
RyanfaeScotland

si la date provient d'une base de données, je ne sais pas comment cela pourrait aider ... je ne peux pas le comprendre
Antoine Pelletier

41

Cela fonctionne si vous souhaitez afficher dans une zone de texte:

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

la date ne sera pas affichée correctement si le navigateur a un format différent dans les paramètres que "jj-MM-aaaa", c'est-à-dire "MM-jj-aaaa"
Oleg Sh

16

La date / heure dans la base de dates ne sera pas du tout une version formatée . Ce sera juste la date / heure elle-même. La façon dont vous affichez cette date / heure lorsque vous extrayez la valeur de la base de données est une autre affaire. Je soupçonne fortement que vous voulez vraiment:

model.Returndate = DateTime.Now.Date;

ou éventuellement

model.Returndate = DateTime.UtcNow.Date;

Oui, si vous regardez la base de données en utilisant SQL Server Management Studio ou autre, vous verrez maintenant minuit - mais qui est hors de propos, et quand vous allez chercher la date de la base de données et l' afficher à un utilisateur, alors vous pouvez appliquer le format correspondant .

EDIT: En ce qui concerne votre question modifiée, le problème n'est pas avec le modèle - c'est la façon dont vous spécifiez la vue. Vous devriez utiliser quelque chose comme:

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

dest le spécificateur de format de date et d'heure standard pour le modèle de date courte (ce qui signifie qu'il prendra en compte les paramètres culturels actuels).

C'est ce que j'ai répété à plusieurs reprises - que lorsque vous affichez la date / heure à l'utilisateur , c'est le moment de le formater sous forme de date sans heure.

EDIT: Si cela ne fonctionne pas, il devrait y avoir un moyen de décorer le modèle ou la vue avec une chaîne de format - ou quelque chose comme ça. Je ne suis pas vraiment une personne MVC, mais j'ai l'impression qu'il devrait y avoir un bon moyen de le faire de manière déclarative ...


Le DateTime.Now.Date affiche toujours l'heure avec la date.
ZVenue

1
@ZVenue: L'affiche où? Vous devez stocker une valeur DateTime et utiliser un spécificateur de format de date uniquement partout où vous affichez la date. Le code que vous avez donné (définissant une propriété dans le modèle) est vraisemblablement destiné au stockage, donc peu importe qu'il ait une heure de minuit.
Jon Skeet

Jon suggère de quoi je parlais, en réservant la date à SQL telle qu'elle est; vous pouvez alors simplement formater votre date de manière appropriée lorsque vous l'imprimez.
Russ Clarke

2
@Jon: J'obtiens cette erreur lorsque j'ai utilisé votre code d'édition pour html.editorfor .... "Les modèles ne peuvent être utilisés qu'avec l'accès aux champs, l'accès aux propriétés, l'index de tableau à une dimension ou les expressions d'indexation personnalisées à paramètre unique". ... au moment de l'exécution
ZVenue

1
@ZVenue: Jetez un œil à ceci aussi: stackoverflow.com/questions/5033902/…
Jon Skeet

8

Vous pouvez modifier votre ViewModel comme ci-dessous:

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

Cette solution résout également le problème du conflit de sélecteur de date de Chrome. Si vous spécifiez simplement Datatype.Date dans Viewmodel, Chrome utilise sa propre version de datepicker dans la zone de texte. Je vous remercie!
Katherine

7

Vous pouvez appliquer un format de date et d'heure personnalisé en utilisant ToStringcomme:

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

Vous DateTime.ToStringtrouverez ici et ici des informations complémentaires sur les modèles de formats .

Modifier: après la modification de votre question, tout comme les autres suggestions, vous devez appliquer le format de date à votre vue:

model.Returndate = DateTime.Now.Date;

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

1
cela n'aidera cependant pas à sauver la date.
Russ Clarke

Ne peut-il pas le sauver en appelant model.Returndate.ToString("mm/dd/yyyy")?
Jalal Said

C'est un problème .. Je mets cette valeur dans un champ datetime dans la base de données. Donc, cela ne fonctionnera pas ... s'il vous plaît voir mon message original.
ZVenue

Ne devrait-il pas être .ToString ("MM / jj / aaaa")? mm c'est des minutes, pas des mois!
Bodrick

@Bodrich: merci, mis à jour, je viens de copier-coller son motif.
Jalal Said

4

Je ne suis pas sûr dans Razor mais dans ASPX, vous faites:

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

Il doit y avoir quelque chose de similaire dans Razor. J'espère que cela aidera quelqu'un.


1
Oui, cela fonctionnerait également dans la syntaxe Razor, par exemple @ Html.Encode (string.Format ("0: D", item.Modify_Date))
Ciaran Gallagher

4

Si vous avez une boucle for telle que celle ci-dessous.

Remplacez @ item.StartDate par @ item.StartDate.Value.ToShortDateString ()

Cela supprimera l'heure au cas où vous ne pourriez pas annoter votre propriété dans le modèle comme dans mon cas.

<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

Incluez des annotations de données telles que DisplayFormat et ApplyFormatInEditMode pour obtenir la sortie souhaitée.

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

Maintenant, votre date de facturation s'affichera comme.

entrez la description de l'image ici


Veuillez jeter un œil aux autres réponses. Pensez-vous que le vôtre est nécessaire et ajoute un nouveau contenu de qualité à la publication?
L. Guthardt

1

Vous pouvez simplement convertir le datetime. Quelque chose comme:

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

1

J'ai eu quelques problèmes avec les autres solutions sur cette page, alors j'ai pensé que je laisserais cela.

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

Il vous suffit donc d'ajouter "{0: d}" dans le deuxième paramètre et vous devriez être prêt à partir.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.