Відображати лише дату та час


91

У бритві 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)

Тут відображається дата як Дата та Час разом ... Я хочу, щоб відображалася лише дата. Не час. Сподіваюсь, ця редакція пояснює краще.


1
не турбуйтеся про 00:00:00 (опівночі). Просто відформатуйте вихідні дані, ToString("mm/dd/yyyy");щоб мати змогу побачити саме те, що ви хочете.
Чейз Флорелл

1
Збережіть дані в базі даних як DateTime. Ви виконуєте форматування рядка на ВИХІДІ ... Форматуйте його лише в кінцевому переглядачі.
Чейз Флорелл

Відповіді:


96

Якщо тип стовпця 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

Це був лише приклад того, як форматувати результат; Я оновлю свою відповідь.
Russ Clarke

14
@Russ: редактор для вашого оновлення не працював. Це видає мені помилку: "Шаблони можна використовувати лише з польовим доступом, доступом до властивостей, одновимірним індексом масиву або однозначними виразами користувацького індексатора."
ZVenue

1
Я додаю це до своєї відповіді
Русс Кларк

19
ви повинні видалити '@ Html.EditorFor (model => model.ReturnDate.ToShortDateString ())' з відповіді, оскільки це не працює.
James Reategui,

129

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

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

Він також приховає кнопку часу від пункту вибору дати.

Вибачте, якщо ця відповідь трохи запізнилася;)


Дуже дякую. Це було дуже корисно для мене! +1
Дмитро

1
Якраз те, що мені було потрібно. Відмінно!
RealityDysfunction

1
Нещодавно у мене була ситуація, коли Chrome додав смішні речі, коли тип введення - дата, частина html5, я думаю, я хотів використовувати jquery datepicker замість цього, тому я пішов з DataType.Text - це все ще дозволило мені використовувати форматування досить круто
Джон

2
Не потрібно просити вибачення за запізнення, розміщення відповідей на старі запитання може бути чудовою підмогою для людей, які не мають ОП. Це відповідь, яку я шукав, оскільки знав, що це можливо, але не пам’ятав як, і ви її опублікували 3 роки тому. Якщо що, ти неймовірно рано.
RyanfaeScotland

якщо дата походить з бази даних, я не знаю, як це може допомогти ... не можу зрозуміти
Антуан Пелтьє,

41

Це працює, якщо ви хочете відобразити в TextBox:

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

дата буде відображатися неправильно, якщо браузер має інший формат в налаштуваннях, ніж "dd-MM-yyyy", тобто "MM-dd-yyyy"
Олег Шов

16

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

model.Returndate = DateTime.Now.Date;

або можливо

model.Returndate = DateTime.UtcNow.Date;

Так, якщо ви подивитесь на базу даних за допомогою SQL Server Studio або що завгодно, тепер ви побачите опівночі - але це неактуально, і коли ви вибираєте дату з бази даних і показуєте її користувачеві, тоді ви можете застосувати відповідний формат .

EDIT: Стосовно вашого відредагованого запитання, проблема полягає не в моделі, а в тому, як ви вказуєте подання. Ви повинні використовувати щось на зразок:

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

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

Це той біт, про який я вже неодноразово говорив - коли ви показуєте користувачеві дату / час , саме час відформатувати його як дату без часу.

РЕДАГУВАТИ: Якщо це не працює, повинен бути спосіб прикрасити модель або вигляд за допомогою рядка формату - або щось подібне. Я насправді не людина MVC, але, схоже, повинен бути хороший спосіб зробити це декларативно ...


DateTime.Now.Date все ще відображає час разом із датою.
ZVenue

1
@ZVenue: Де відображається? Ви повинні зберігати значення DateTime і використовувати специфікатор формату лише для дати, де б ви не відображали дату. Код, який ви дали (встановлення властивості в моделі), імовірно, призначений для зберігання, тому не має значення, що у нього час опівночі.
Джон Скіт,

Джон пропонує, про що я говорив, зберігаючи дату в SQL, як вона є; тоді ви можете просто відформатувати дату належним чином, роздрукувавши її.
Russ Clarke

2
@Jon: Я отримую цю помилку, коли використовував ваш код редагування для html.editorfor .... "Шаблони можна використовувати лише з польовим доступом, доступом до властивостей, одновимірним індексом масиву або однопараметричними виразами індексатора". ... під час виконання
ZVenue

1
@ZVenue: Погляньте і на це: stackoverflow.com/questions/5033902/…
Джон Скіт,

8

Ви можете змінити свій ViewModel, як показано нижче:

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

Це рішення також вирішує проблему конфлікту Datepicker у Chrome. Якщо ви просто вказали Datatype.Date у Viewmodel, Chrome використовує власну версію datepicker у текстовому полі. Дякую!
Кетрін

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
це не допоможе питання збереження дати.
Russ Clarke

Чи не може він врятувати це дзвінком model.Returndate.ToString("mm/dd/yyyy")?
Джалал Саїд,

Це проблема .. Я поміщаю це значення в поле дати та часу в базі даних. Так що це не спрацює .. будь ласка, перегляньте мій оригінальний пост.
ZVenue

Чи не повинно бути .ToString ("MM / dd / yyyy")? мм - це хвилини, а не місяці!
Бодрік,

@Bodrich: дякую, оновлено, я просто копіюю вставте його шаблон.
Джалал Саїд,

4

Я не впевнений у Razor, але в ASPX ви:

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

Щось подібне повинно бути в Бритві. Сподіваємось, це комусь допоможе.


1
Так, це також буде працювати в синтаксисі Razor, наприклад, @ Html.Encode (string.Format ("0: D", item.Modify_Date))
Ciaran Gallagher

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

Тепер дата вашого рахунку відображатиметься як.

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


Будь ласка, погляньте на інші відповіді. Чи вважаєте ви своїм потрібним і додаєте до публікації якийсь новий якісний вміст?
Л.Гухардт,

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}" у другий параметр, і ви повинні бути готові.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.