Преобразование формата DateTime с помощью бритвы


Ответы:


264

Пытаться:

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

или вы можете использовать [DisplayFormat]атрибут в своей модели представления:

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

и, на ваш взгляд, просто:

@Html.DisplayFor(x => x.Date)

3
Я пробовал это с текстовым полем, и, к сожалению, это не сработало. Есть ли способ сделать это для текстовых полей?
Tobias

2
Для текстового поля просто используйте EditorFor вместо DisplayFor
Brandon シ Renfrow

10
Не забудьте установить «ApplyFormatInEditMode = true» в определении DisplayFormat, если вы хотите, чтобы форматирование даты применялось к элементам EditorFor ().
Latedeveloper

1
Мне нужно было использовать это для поля DateTime, чтобы использовать встроенное средство выбора даты. Без аннотации DisplayFormat консоль javascript в браузере показывала бы что-то вроде «Указанное значение '1/1/1990 12:00:00 AM' не соответствует требуемому формату 'yyyy-MM-dd'». Мне пришлось установить для DataFormatString и ApplyFormatInEditMode значение true, чтобы ошибка исчезла и значение правильно отображалось при использовании EditorFor в моем представлении MVC.
Марк

Это работает для меня, но я не знаю - у меня такое чувство, что я нарушаю разделение проблем, применяя логику для форматирования даты (проблемы представления) в модели через атрибут. Я понимаю, что Microsoft ожидает, что это будет работать именно так, но кажется, что форматирование отображения данных должно быть изолировано от представления, а модель должна быть просто моделью.
barrypicker

73

Это решение:

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

Перед ToString () используйте Value .


1
этот код правильный, но если столбец даты пуст, это вызовет ошибку, поэтому попробуйте это
Shaijut

Stom прав, если у вас есть нулевые значения, вы получите ошибку, спасибо за ссылку
Ник Кан

Именно то, что я искал
Роджер Телло

Нулевое исключение можно обработать с помощью оператора объединения с нулевым значением - @(item.DOB?.ToString("dd-MMM-yyyy")). Или используя свойство HasValue - @(item.DataDate.HasValue ? item.DataDate.Value.Date.ToString("dd MMM yyyy") : null). В обоих случаях свойство должно иметь значение datetime, допускающее значение NULL.
quasar

31

Попробуйте это в MVC 4.0

@Html.TextBoxFor(m => m.YourDate, "{0:dd/MM/yyyy}", new { @class = "datefield form-control", @placeholder = "Enter start date..." })

2
Я не знаю, почему кто-то проголосовал против этого ответа.
Микаил Абдуллаев

Я предполагаю, что отрицательный голос был вызван тем, что это решение форматировало дату как «дд / ММ / гггг», а не в формате «дд МММ гггг», который запрашивал OP
PTD

1
Это должен быть выбранный ответ. Я пробовал другие, но ничего не помогло. Спасибо.
Виктор Ли

20

Атрибут [DisplayFormat] используется только в EditorFor / DisplayFor, но не в исходных HTML API, таких как TextBoxFor. Я получил это, выполнив следующие действия:

Модель:

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

Посмотреть:

        <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>

Выход: 30.12.2011

Связанная ссылка:

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


1
Как вариант, вы также можете использовать @ string.Format ("{0: MM yyyy}", imprint.VersionDate)
Диганта Кумар,


4

Для Razor поместите файл DateTime.cshtml в папку Views / Shared / EditorTemplates. DateTime.cshtml содержит две строки и создает текстовое поле с датой в формате 9/11/2001.

@model DateTime?
@Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" })

1
Спасибо ... не удалось заставить никого из остальных работать. Неужели C # / Razor настолько изменился, что простой формат даты должен проходить через так много вещей, чтобы работать? Самый предлагаемый ответ в Интернете: .... ToString («дд МММ гггг») никогда не работал у меня, и я всегда заканчивал тем, что вставлял его в переменную, преобразовывая ее в дату, а затем выводил дату. Я знал, что где-то должен быть один лайнер.
Энтони Григгс

Энтони Григгс, я чувствую тебя, потому что. Рад разделить боль, чтобы все мы могли выиграть через шесть с половиной лет!
Жюль Бартоу

3

Как правило, записанный месяц экранируется как MMM, а год из 4 цифр - как yyyy, поэтому ваша строка формата должна выглядеть как «dd MMM yyyy».

DateTime.ToString("dd MMM yyyy")

@ ViewBag.PurchaseInfo.LastPurchaseTime.ToString ("dd.MM.yyyy")
yonexbat

3

Я не смог заставить это работать полностью на основе приведенных выше предложений. Включение DataTypeAttribute[DataType(DataType.Date)] похоже, решило мою проблему, см.

Модель

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

Посмотреть

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

HTH


1

Для всего данного решения, когда вы пробуете это в современном браузере (например, FF), и вы установили правильную модель

// 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) будет отображать ( тип ввода установлен на дату на основе ваших настроек даты в вашей модели!)

<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>

И браузер покажет

введите описание изображения здесь

Чтобы исправить это, вам нужно изменить тип на текст вместо даты (также, если вы хотите использовать свой собственный календарь)

@Html.EditorFor(model => model.Start, "{0:dd-MM-yyyy}", new { htmlAttributes = new { @class = "form-control", @type = "text" } })
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.