Отображать только дату и без времени

94

В бритве MVC я помещаю текущую дату в базу данных вот так ...

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

Так как поле базы данных является типом данных datetime, и я конвертирую текущую дату в строковый формат, это не работает .. как я могу это сделать? Я использую строковый формат, потому что мне нужна дата в формате мм / дд / гггг, а не в формате времени мм / дд / гггг чч: мм: сс ..

РЕДАКТИРОВАТЬ:

В контроллере у меня есть

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

В частичном обзоре у меня есть

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

Здесь дата отображается как дата и время вместе ... Я хочу, чтобы отображалась только дата. Не время. Надеюсь, это правка лучше объясняет.

ZVenue
источник
1
не беспокойтесь о 00:00:00 (полночь). Просто отформатируйте вывод ToString("mm/dd/yyyy");, чтобы видеть именно то, что вы хотите.
Чейз Флорелл
1
Сохраните данные в базе данных как DateTime. Вы выполняете форматирование строки на ВЫХОДЕ ... Отформатируйте его только для конечного средства просмотра.
Чейз Флорелл

Ответы:

97

Если тип столбца - DateTime в SQL, тогда он будет хранить время, в которое вы его передали или нет.

Лучше было бы правильно сохранить дату:

model.ReturnDate = DateTime.Now;

а затем отформатируйте его, когда вам нужно отобразить его:

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

Или, если вы используете EditorFor:

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

или

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

Чтобы добавить свойство к вашей модели, добавьте этот код:

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

Затем в вашем PartialView:

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

РЕДАКТИРОВАТЬ:

Привет, ребята, просто хочу пояснить для этого ответа, что, если я говорю: «Если вы используете EditorFor», это означает, что вам нужен шаблон EditorFor для типа значения, которое вы пытаетесь представить.

Шаблоны редактора - отличный способ управлять повторяющимися элементами управления в MVC:

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

Вы можете использовать их для наивных типов, таких как String, как я сделал выше; но они особенно хороши, поскольку позволяют создавать шаблоны набора полей ввода для более сложного типа данных.

Расс Кларк
источник
не уверен, кто проголосовал против этого ... но я не использую HTML.label для отображения этого ... Я использую HTML.EditorFor (model => model.Returndate), как мне отформатировать отображение в этом случае ...
ZVenue
Это был просто пример того, как отформатировать ваш результат; Я обновлю свой ответ.
Расс Кларк
14
@Russ: сделанный вами редактор обновлений не работал. Это выдает мне ошибку: «Шаблоны можно использовать только с доступом к полю, доступом к свойствам, индексом одномерного массива или выражениями пользовательского индексатора с одним параметром».
ZVenue
1
Я добавлю это к своему ответу
Расс Кларк
19
вам следует удалить "@ Html.EditorFor (model => model.ReturnDate.ToShortDateString ())" из ответа, потому что это не работает.
Джеймс Ратеги
131

Просто пришлось самому разобраться с этим сценарием - нашел действительно простой способ сделать это, просто аннотируйте свое свойство в модели следующим образом:

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

Это также скроет кнопку времени из окна выбора даты.

Извините, если этот ответ немного запоздал;)

Ленивый Дэйв
источник
Большое спасибо. Это был очень полезный пост для меня! +1
Дмитрий
1
Как раз то, что мне было нужно. Превосходно!
RealityDysfunction
1
Недавно у меня была ситуация, когда хром вставлял забавные вещи, когда тип ввода - дата, я думаю, часть html5, я хотел вместо этого использовать jquery datepicker, поэтому я выбрал DataType.Text - это все еще позволяло мне использовать достаточно крутое форматирование
Джон
2
Не нужно извиняться за опоздание, публикация ответов на старые вопросы может быть большим подспорьем для людей, которые не являются OP. Это ответ, который я искал, так как знал, что это возможно, но не мог вспомнить, как, и вы опубликовали его 3 года назад. Во всяком случае, вы невероятно рано.
RyanfaeScotland
если дата взята из базы данных, я не знаю, как это может помочь ... не могу понять
Антуан Пеллетье
41

Это работает, если вы хотите отображать в TextBox:

@Html.TextBoxFor(m => m.Employee.DOB, "{0:dd-MM-yyyy}")
Brij
источник
дата будет отображаться некорректно, если в настройках браузера указан формат, отличный от "дд-ММ-гггг", т.е. "ММ-дд-гггг"
Олег Ш
16

Дата / время в базе данных вообще не будет форматированной версией. Это будет просто сама дата / время. Другое дело, как вы отображаете эту дату / время при извлечении значения из базы данных. Я сильно подозреваю, что вы действительно хотите:

model.Returndate = DateTime.Now.Date;

или возможно

model.Returndate = DateTime.UtcNow.Date;

Да, если посмотреть на базы данных с помощью SQL Server Studio , или любой другой , вы теперь увидите полночь - но это не имеет значения, и когда вы запрашиваете дату из базы данных и отображать его пользователю, то вы можете применить соответствующий формат .

РЕДАКТИРОВАТЬ: Что касается вашего отредактированного вопроса, проблема не в модели, а в том, как вы указываете представление. Вы должны использовать что-то вроде:

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

где d- описатель стандартного формата даты и времени для короткого шаблона даты (что означает, что он будет учитывать текущие культурные параметры).

Это то, о чем я неоднократно говорил: когда вы показываете пользователю дату / время , самое время отформатировать его как дату без времени.

РЕДАКТИРОВАТЬ: если это не сработает, должен быть способ украсить модель или представление строкой формата или чем-то в этом роде. Я не совсем человек MVC, но мне кажется, что должен быть хороший способ сделать это декларативно ...

Джон Скит
источник
DateTime.Now.Date по-прежнему отображает время вместе с датой.
ZVenue
1
@ZVenue: где это отображается? Вы должны хранить значение DateTime и использовать описатель формата только для даты везде, где вы отображаете дату. Приведенный вами код (установка свойства в модели) предположительно предназначен для хранения, поэтому не имеет значения, что сейчас полночь.
Джон Скит,
Джон предлагает то, о чем я говорил, сохраняя дату в SQL как есть; затем вы можете просто отформатировать дату соответствующим образом при ее печати.
Расс Кларк
2
@Jon: Я получаю эту ошибку, когда использую ваш код редактирования для html.editorfor .... «Шаблоны можно использовать только с доступом к полю, доступом к свойствам, индексом одномерного массива или выражениями пользовательского индексатора с одним параметром». ... во время выполнения
ZVenue
1
@ZVenue: Взгляните и на это: stackoverflow.com/questions/5033902/…
Джон Скит,
8

Вы можете изменить свою ViewModel, как показано ниже:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}",ApplyFormatInEditMode = true)]
Ишант Ситаула
источник
Это решение также решает проблему конфликта датпикеров Chrome. Если вы просто укажете Datatype.Date в Viewmodel, Chrome использует собственную версию datepicker в текстовом поле. Спасибо!
Katherine
7

Вы можете применить собственный формат даты и времени, ToStringнапример:

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

Дополнительную информацию о DateTime.ToStringшаблонах форматов можно найти здесь и здесь .

Изменить: после редактирования вашего вопроса, как и другие предложения, вам следует применить формат даты в вашем представлении:

model.Returndate = DateTime.Now.Date;

@Html.EditorFor(model => model.Returndate.Date.ToString("MM/dd/yyyy"))
Джалал Саид
источник
1
это не поможет сохранить дату.
Расс Кларк
Разве он не может спасти это звонком model.Returndate.ToString("mm/dd/yyyy")?
Джалал Саид
Это проблема .. Я помещаю это значение в поле даты и времени в базе данных. Так что это не сработает .. пожалуйста, посмотрите мой исходный пост.
ZVenue
Разве это не должно быть .ToString ("ММ / дд / гггг")? мм - это минуты, а не месяцы!
Bodrick
@Bodrich: спасибо, обновлено, я просто скопировал и вставил его шаблон.
Джалал Саид
4

Я не уверен в Razor, но в ASPX вы делаете:

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

В Razor должно быть что-то подобное. Надеюсь, это кому-то поможет.

Джени Рамирес
источник
1
Да, это также будет работать в синтаксисе Razor, например, @ Html.Encode (string.Format ("0: D", item.Modify_Date))
Киаран Галлахер
4

Если у вас есть цикл for, как показано ниже.

Измените @ item.StartDate на @ item.StartDate.Value.ToShortDateString ()

Это уберет время на тот случай, если вы не сможете аннотировать свое свойство в модели, как в моем случае.

<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

Включите аннотации данных, такие как DisplayFormat и ApplyFormatInEditMode, чтобы получить желаемый результат.

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

Теперь ваша дата выставления счета будет отображаться как.

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

Прадип Рупарелия
источник
Пожалуйста, взгляните на другие ответы. Как вы думаете, ваше сообщение необходимо и добавляет ли к посту качественный новый контент?
L. Guthardt
1

Вы можете просто преобразовать дату и время. Что-то типа:

@Convert.ToString(string.Format("{0:dd/MM/yyyy}", Model.Returndate))
АНЖЫР
источник
1

У меня были проблемы с другими решениями на этой странице, поэтому я решил бросить это.

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

Таким образом, вам нужно только добавить "{0: d}" во второй параметр, и все готово.

Ли
источник