Conversion du format DateTime à l'aide de rasoir

104

Quel est le problème avec ce qui suit?

@Convert.ToDateTime((@item.Date.ToShortDateString())," dd - M - yy")

@ item.Date s'affiche le 20/11/2005 à minuit et je veux afficher le 20 novembre 2011

apprentissage
la source
1
Les combinaisons des différents spécificateurs de format de date qui existent peuvent être trouvées ici: msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
Joseph Woodward

Réponses:

264

Essayer:

@item.Date.ToString("dd MMM yyyy")

ou vous pouvez utiliser l' [DisplayFormat]attribut sur votre modèle de vue:

[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")]
public DateTime Date { get; set }

et à votre avis simplement:

@Html.DisplayFor(x => x.Date)
Darin Dimitrov
la source
3
J'ai essayé cela avec une zone de texte et malheureusement cela n'a pas fonctionné. Existe-t-il un moyen de le faire pour les zones de texte?
Tobias
2
Pour une zone de texte, utilisez simplement EditorFor au lieu de DisplayFor
Brandon シ Renfrow
10
N'oubliez pas de définir "ApplyFormatInEditMode = true" dans votre définition DisplayFormat si vous souhaitez que la mise en forme de la date soit appliquée aux éléments EditorFor ().
Développeur tardif
1
J'avais besoin de l'utiliser pour un champ DateTime afin d'utiliser le sélecteur de date intégré. Sans l'annotation DisplayFormat, la console javascript dans le navigateur afficherait quelque chose comme "La valeur spécifiée '1/1/1990 12:00:00 AM' n'est pas conforme au format requis, 'aaaa-MM-jj'." J'ai dû définir à la fois le DataFormatString et définir ApplyFormatInEditMode sur true pour que l'erreur disparaisse et que la valeur s'affiche correctement lorsque vous utilisez EditorFor dans ma vue MVC.
Mark
Cela fonctionne pour moi, mais je ne sais pas - j'ai le sentiment de violer la séparation des préoccupations en appliquant une logique pour formater une date (un problème de présentation) dans le modèle via un attribut. Je comprends que c'est ainsi que Microsoft s'attend à ce que cela fonctionne, mais il semble simplement que le formatage de l'affichage des données doit être isolé de la vue et que le modèle ne doit être qu'un modèle.
barrypicker le
73

Voici la solution:

@item.Published.Value.ToString("dd. MM. yyyy")

Avant ToString (), utilisez Value .

Miroslav Holec
la source
1
ce code est correct mais si la colonne de date est nulle, cela
générera une
Stom est correct, si vous avez des valeurs nulles vous jettera l'erreur, merci pour le lien
Nick Kahn
Juste ce que je cherchais
Roger Tello
Une exception nulle peut être gérée à l'aide de l'opérateur de fusion nul - @(item.DOB?.ToString("dd-MMM-yyyy")). Ou en utilisant la propriété HasValue - @(item.DataDate.HasValue ? item.DataDate.Value.Date.ToString("dd MMM yyyy") : null). Dans les deux cas, la propriété doit être datetime Nullable.
quasar
31

Essayez ceci dans MVC 4.0

@Html.TextBoxFor(m => m.YourDate, "{0:dd/MM/yyyy}", new { @class = "datefield form-control", @placeholder = "Enter start date..." })
pseudo
la source
2
Je ne sais pas pourquoi quelqu'un refuserait cette réponse.
Mikayil Abdullayev
Je suppose que le vote défavorable était dû à cette solution mettant en forme la date comme "jj / MM / aaaa" plutôt que le format "jj MMM aaaa" demandé par l'OP
PTD
1
Celui-ci devrait être la réponse choisie. J'ai essayé les autres et aucun n'a fonctionné. THX.
Victor Lee
20

L'attribut [DisplayFormat] n'est utilisé que dans EditorFor / DisplayFor, et non par les API HTML brutes telles que TextBoxFor. Je l'ai fait fonctionner en faisant ce qui suit,

Modèle:

[Display(Name = "When was that document issued ?")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime? LiquorLicenceDocumentIssueDate { get; set; }

Vue:

        <div id="IsLiquorLicenceDocumentOnPremisesYes" class="groupLongLabel">
            @Html.LabelFor(m => m.LiquorLicenceDocumentIssueDate)
            <span class="indicator"></span>
            @Html.EditorFor(m => m.LiquorLicenceDocumentIssueDate)
            <span id="validEmail"></span>
            <br />
            @Html.ValidationMessageFor(m => m.LiquorLicenceDocumentIssueDate)
        </div>

Sortie: 30/12/2011

Lien connexe:

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.applyformatineditmode.aspx

Diganta Kumar
la source
1
Vous pouvez également utiliser @ string.Format ("{0: MM yyyy}", imprint.VersionDate)
Diganta Kumar
8

Le code ci-dessous vous aidera

@Html.Label(@item.Date.Value.ToString("dd - M - yy"))
Anjan Kant
la source
4

Pour Razor, placez le fichier DateTime.cshtml dans le dossier Views / Shared / EditorTemplates. DateTime.cshtml contient deux lignes et produit un TextBox avec une date au format 9/11/2001.

@model DateTime?
@Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" })
Jules Bartow
la source
1
Merci ... je n'ai pas réussi à faire travailler les autres. C # / Razor a-t-il tellement changé pour qu'un simple format de date doive passer par tant de choses pour fonctionner? La réponse la plus suggérée sur Internet: .... ToString ("jj MMM aaaa") n'a jamais fonctionné pour moi et j'avais toujours fini par le mettre dans une variable en le convertissant en une date et en sortant la date. Je savais qu'il devait y avoir une seule ligne qui fonctionnait quelque part.
Anthony Griggs
Anthony Griggs, je te sens cuz. Heureux de partager la douleur pour que nous puissions tous gagner - 6 ans et demi plus tard!
Jules Bartow
3

En général, le mois écrit est échappé comme MMM, l'année à 4 chiffres comme aaaa, donc votre chaîne de format doit ressembler à "jj MMM aaaa"

DateTime.ToString("dd MMM yyyy")
flq
la source
@ ViewBag.PurchaseInfo.LastPurchaseTime.ToString ("dd.MM.yyyy")
yonexbat
3

Je n'ai pas été en mesure de faire fonctionner cela entièrement sur la base des suggestions ci-dessus. L'inclusion de DataTypeAttribute a [DataType(DataType.Date)]semblé résoudre mon problème, voir:

Modèle

[Required]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public DateTime RptDate { get; set; }

Vue

@Html.EditorFor(m => m.CLPosts.RptDate)

HTH

Fraze
la source
1

Pour toute la solution donnée, lorsque vous essayez ceci dans un navigateur moderne (comme FF) et que vous avez défini le bon modèle

// Model
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
public DateTime Start { get; set; }

// View
<div class="form-group">
    @Html.LabelFor(model => model.Start, htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Start, "{0:dd-MM-yyyy}", new { htmlAttributes = new { @class = "form-control"} })
    </div>
</div>

mvc (5) sera rendu (le type d'entrée est défini sur la date en fonction de vos paramètres de date dans votre modèle!)

<div class="col-md-10">
<input class="form-control text-box single-line" data-val="true" data-val-date="The field Start must be a date." data-val-required="The Start field is required." id="Start" name="Start" value="01-05-2018" type="date">
        <span class="field-validation-valid text-danger" data-valmsg-for="Start" data-valmsg-replace="true"></span>
</div>

Et le navigateur affichera

entrez la description de l'image ici

Pour résoudre ce problème, vous devez changer le type en texte au lieu de date (également si vous souhaitez utiliser votre calendrier personnalisé)

@Html.EditorFor(model => model.Start, "{0:dd-MM-yyyy}", new { htmlAttributes = new { @class = "form-control", @type = "text" } })
Bunkerbuster
la source