Wyświetlaj tylko datę bez czasu


92

W maszynce do golenia MVC umieszczam aktualną datę w bazie danych w ten sposób ..

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

Ponieważ pole bazy danych ma typ danych typu datetime i konwertuję bieżącą datę na format ciągu, to nie działa. Jak mogę to zrobić? Robię format ciągu, ponieważ chcę, aby data była w formacie mm / dd / rrrr, a nie w formacie mm / dd / rrrr hh: mm: ss.

EDYTOWAĆ:

W kontrolerze mam

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

W częściowym spojrzeniu mam

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

W tym miejscu wyświetla razem datę i godzinę ... Chcę, aby była wyświetlana tylko data. Nie czas. Mam nadzieję, że ta zmiana wyjaśnia lepiej.


1
nie martw się o 00:00:00 (północ). Po prostu sformatuj dane wyjściowe, ToString("mm/dd/yyyy");aby zobaczyć dokładnie to, czego chcesz.
Chase Florell

1
Zapisz dane w bazie danych jako DateTime. Wykonujesz formatowanie ciągu na OUTPUT ... Formatuj go tylko do końcowej przeglądarki.
Chase Florell

Odpowiedzi:


96

Jeśli typ kolumny to DateTime w SQL, będzie przechowywać czas, w którym go przekażesz lub nie.

Lepiej byłoby odpowiednio zapisać datę:

model.ReturnDate = DateTime.Now;

a następnie sformatuj go, gdy chcesz go wyświetlić:

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

Lub jeśli używasz EditorFor:

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

lub

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

Aby dodać właściwość do swojego modelu, dodaj ten kod:

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

Następnie w swoim PartialView:

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

EDYTOWAĆ:

Cześć, chcę tylko wyjaśnić tę odpowiedź, że mówiąc „Jeśli używasz EditorFor”, oznacza to, że musisz mieć szablon EditorFor dla typu wartości, który próbujesz reprezentować.

Szablony edytorów to fajny sposób zarządzania powtarzalnymi kontrolkami w MVC:

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

Możesz ich używać do naiwnych typów, takich jak String, jak zrobiłem powyżej; ale są one szczególnie świetne do tworzenia szablonów zestawu pól wejściowych dla bardziej skomplikowanego typu danych.


nie jestem pewien, kto przegłosował to .. ale nie używam HTML.label do wyświetlania tego .. Używam HTML.EditorFor (model => model.Returndate) jak sformatować wyświetlacz w tym przypadku ...
ZVenue

To był tylko przykład tego, jak sformatować wynik; Zaktualizuję odpowiedź.
Russ Clarke,

14
@Russ: edytor aktualizacji, którego dokonałeś, nie działał. Wyświetla mi się błąd „Szablony mogą być używane tylko z dostępem do pól, dostępem do właściwości, indeksem tablicy jednowymiarowej lub niestandardowymi wyrażeniami indeksatora z jednym parametrem”.
ZVenue

1
Dodam to do mojej odpowiedzi
Russ Clarke

19
powinieneś usunąć „@ Html.EditorFor (model => model.ReturnDate.ToShortDateString ())” z odpowiedzi, ponieważ to nie działa.
James Reategui

130

Po prostu musiałem sobie poradzić z tym scenariuszem - znalazłem naprawdę łatwy sposób, aby to zrobić, po prostu dodaj adnotacje do swojej nieruchomości w modelu w następujący sposób:

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

Spowoduje to również ukrycie przycisku czasu w selektorze dat.

Przepraszam, jeśli ta odpowiedź jest trochę spóźniona;)


Wielkie dzięki. To był dla mnie bardzo pomocny post! +1
Dmytro

1
Dokładnie to, czego potrzebowałem. Świetny!
RealityDysfunction

1
Niedawno miałem sytuację, w której chrome wstawiał zabawne rzeczy, gdy typem wejściowym jest data, myślę, że część html5, zamiast tego chciałem użyć jquery datepicker, więc wybrałem DataType.Text - to nadal pozwalało mi używać formatowania wystarczająco fajnego
John

2
Nie musisz przepraszać za spóźnienie, publikowanie odpowiedzi na stare pytania może być bardzo pomocne dla osób, które nie są OP. To jest odpowiedź, której szukałem, ponieważ wiedziałem, że jest to możliwe, ale nie pamiętałem jak, a opublikowałeś ją 3 lata temu. Jeśli już, jesteś niesamowicie wcześnie.
RyanfaeScotland

jeśli data pochodzi z bazy danych, nie wiem, jak to może pomóc ... nie mogę tego rozgryźć
Antoine Pelletier

41

Działa to, jeśli chcesz wyświetlić w TextBox:

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

data będzie wyświetlana nieprawidłowo, jeśli przeglądarka ma inny format w ustawieniach niż „dd-MM-rrrr”, tj. „MM-dd-rrrr”
Oleg Sh

16

Data / godzina w bazie danych w ogóle nie będzie wersją sformatowaną . Będzie to po prostu sama data / godzina. Sposób wyświetlania tej daty / godziny podczas wyodrębniania wartości z bazy danych to inna sprawa. Podejrzewam, że naprawdę chcesz tylko:

model.Returndate = DateTime.Now.Date;

lub ewentualnie

model.Returndate = DateTime.UtcNow.Date;

Tak, jeśli spojrzysz na bazę danych za pomocą SQL Server Studio lub cokolwiek innego, zobaczysz północ - ale to nie ma znaczenia, a kiedy pobierzesz datę z bazy danych i wyświetlisz ją użytkownikowi, wtedy można stosować odpowiednie formatu .

EDYCJA: Jeśli chodzi o edytowane pytanie, problem nie dotyczy modelu - to sposób określania widoku. Powinieneś użyć czegoś takiego:

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

gdzie djest standardowym specyfikatorem formatu daty i godziny dla wzorca daty krótkiej (co oznacza, że ​​uwzględni bieżące ustawienia kulturowe).

To jest ten kawałek, o którym mówiłem wielokrotnie - kiedy wyświetlasz użytkownikowi datę / czas , jest to czas na sformatowanie go jako daty bez godziny.

EDYCJA: Jeśli to nie zadziała, powinien istnieć sposób na udekorowanie modelu lub widoku ciągiem formatu - lub czymś w tym rodzaju. Nie jestem osobą z MVC, ale wydaje mi się, że powinien być dobry sposób na zrobienie tego deklaratywnie ...


DateTime.Now.Date nadal wyświetla czas wraz z datą.
ZVenue,

1
@ZVenue: Wyświetla gdzie? Należy przechowywać wartość DateTime i używać specyfikatora formatu zawierającego tylko datę, gdziekolwiek jest wyświetlana data. Kod, który podałeś (ustawiając właściwość w modelu) jest prawdopodobnie przeznaczony do przechowywania, więc nie ma znaczenia, że ​​jest godzina północy.
Jon Skeet,

Jon sugeruje, o czym mówiłem, zapisując datę do SQL w obecnej postaci; możesz wtedy po prostu odpowiednio sformatować datę podczas drukowania.
Russ Clarke,

2
@Jon: Otrzymuję ten błąd, gdy używam twojego kodu edycji dla html.editorfor .... „Szablony mogą być używane tylko z dostępem do pól, dostępem do właściwości, indeksem tablicy jednowymiarowej lub niestandardowymi wyrażeniami indeksatora z jednym parametrem”. ... w czasie wykonywania
ZVenue

1
@ZVenue: Spójrz też na to: stackoverflow.com/questions/5033902/…
Jon Skeet

8

Możesz zmodyfikować swój ViewModel jak poniżej:

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

To rozwiązanie rozwiązuje również problem konfliktu selektora dat w przeglądarce Chrome. Jeśli po prostu określisz Datatype.Date w Viewmodel, Chrome użyje własnej wersji DatePicker w polu tekstowym. Dziękuję Ci!
Katherine,

7

Możesz zastosować niestandardowy format daty i godziny, używając na ToStringprzykład:

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

Więcej informacji na temat DateTime.ToStringwzorców formatów można znaleźć tutaj i tutaj .

Edycja: po edycji pytania, podobnie jak w przypadku innych sugestii, należy zastosować format daty w widoku:

model.Returndate = DateTime.Now.Date;

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

1
to jednak nie pomoże w kwestii zapisywania daty.
Russ Clarke

Czy nie może tego uratować dzwoniąc model.Returndate.ToString("mm/dd/yyyy")?
Jalal powiedział

To jest problem .. Umieszczam tę wartość w polu daty i godziny w bazie danych. Więc to nie zadziała ... proszę zobaczyć mój oryginalny post.
ZVenue

Czy nie powinno to być .ToString ("MM / dd / rrrr")? mm to minuty, a nie miesiące!
Bodrick,

@Bodrich: dzięki, zaktualizowane, ale skopiowałem tylko jego wzór.
Jalal powiedział

4

Nie jestem pewien w Razor, ale w ASPX robisz:

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

W Razor musi być coś podobnego. Mam nadzieję, że to komuś pomoże.


1
Tak, to również działałoby w składni Razor, np. @ Html.Encode (string.Format ("0: D", item.Modify_Date))
Ciaran Gallagher

4

Jeśli masz pętlę for, taką jak ta poniżej.

Zmień @ item.StartDate na @ item.StartDate.Value.ToShortDateString ()

Spowoduje to usunięcie czasu na wypadek, gdybyś nie mógł dodać adnotacji do swojej nieruchomości w modelu, jak w moim przypadku.

<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

Dołącz adnotacje danych, takie jak DisplayFormat i ApplyFormatInEditMode, aby uzyskać żądane dane wyjściowe.

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

Teraz data Twojego rachunku będzie wyglądać jak.

wprowadź opis obrazu tutaj


Proszę spojrzeć na inne odpowiedzi. Czy uważasz, że Twój jest potrzebny i dodaje do posta nową jakość?
L. Guthardt,

1

Możesz po prostu przekonwertować datę i godzinę. Coś jak:

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

1

Miałem problemy z innymi rozwiązaniami na tej stronie, więc pomyślałem, że wrzucę to.

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

Wystarczy więc dodać „{0: d}” do drugiego parametru i wszystko powinno być gotowe.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.