Chỉ hiển thị ngày và không có thời gian


91

Trong dao cạo MVC, tôi đang đưa ngày hiện tại vào cơ sở dữ liệu như thế này ..

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

Vì trường cơ sở dữ liệu là một kiểu dữ liệu datetime và tôi đang chuyển đổi ngày hiện tại sang định dạng chuỗi, điều này không hoạt động .. làm cách nào tôi có thể thực hiện việc này? Tôi đang thực hiện định dạng chuỗi vì tôi muốn ngày ở định dạng mm / dd / yyyy chứ không phải ở định dạng mm / dd / yyyy hh: mm: ss time ..

BIÊN TẬP:

Trong bộ điều khiển tôi có

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

Trong phần xem xét, tôi có

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

Đây là nơi nó hiển thị ngày dưới dạng Ngày và Giờ cùng nhau ... Tôi chỉ muốn ngày được hiển thị. Không phải lúc. Tôi hy vọng chỉnh sửa này giải thích tốt hơn.


1
đừng lo lắng về 00:00:00 (nửa đêm). Chỉ cần định dạng đầu ra ToString("mm/dd/yyyy");để có thể xem chính xác những gì bạn muốn.
Chase Florell

1
Lưu dữ liệu trong cơ sở dữ liệu dưới dạng DateTime. Bạn thực hiện định dạng chuỗi trên OUTPUT ... Chỉ định dạng nó cho trình xem cuối.
Chase Florell

Câu trả lời:


96

Nếu loại cột là DateTime trong SQL thì nó sẽ lưu trữ thời gian mà bạn vượt qua một hoặc không.

Tốt hơn là nên lưu ngày đúng cách:

model.ReturnDate = DateTime.Now;

và sau đó định dạng nó khi bạn cần hiển thị nó:

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

Hoặc nếu bạn đang sử dụng EditorFor:

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

hoặc là

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

Để thêm thuộc tính vào mô hình của bạn, hãy thêm mã này:

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

Sau đó, trong Chế độ xem từng phần của bạn:

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

BIÊN TẬP:

Xin chào các bạn, chỉ muốn làm rõ cho câu trả lời này rằng bằng câu nói của tôi 'Nếu bạn đang sử dụng EditorFor', điều đó có nghĩa là bạn cần có một mẫu EditorFor cho loại giá trị mà bạn đang cố gắng đại diện.

Các mẫu trình chỉnh sửa là một cách hay để quản lý các điều khiển lặp lại trong MVC:

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

Bạn có thể sử dụng chúng cho các kiểu ngây thơ như String như tôi đã làm ở trên; nhưng chúng đặc biệt tuyệt vời để cho phép bạn tạo mẫu một tập hợp các trường đầu vào cho một kiểu dữ liệu phức tạp hơn.


không chắc ai đã phản đối cái này .. nhưng tôi không sử dụng HTML.label để hiển thị cái này .. Tôi đang sử dụng HTML.EditorFor (model => model.Returndate) làm cách nào để định dạng màn hình trong trường hợp này ...
ZVenue

Đó chỉ là một ví dụ về cách định dạng kết quả của bạn; Tôi sẽ cập nhật câu trả lời của tôi.
Russ Clarke,

14
@Russ: trình chỉnh sửa cho bản cập nhật bạn thực hiện không hoạt động. Nó khiến tôi gặp lỗi "Chỉ có thể sử dụng các mẫu với quyền truy cập trường, quyền truy cập thuộc tính, chỉ mục mảng một chiều hoặc biểu thức trình lập chỉ mục tùy chỉnh một tham số."
ZVenue

1
Tôi sẽ thêm nó vào câu trả lời của tôi
Russ Clarke

19
bạn nên xóa '@ Html.EditorFor (model => model.ReturnDate.ToShortDateString ())' khỏi câu trả lời vì điều đó không hoạt động.
James Reategui

129

Tôi chỉ phải đối phó với tình huống này - đã tìm thấy một cách thực sự dễ dàng để làm điều này, chỉ cần chú thích thuộc tính của bạn trong mô hình như thế này:

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

Nó cũng sẽ ẩn nút thời gian khỏi bộ chọn ngày.

Xin lỗi nếu câu trả lời này hơi muộn;)


Cảm ơn rất nhiều. Đó là một bài viết rất hữu ích cho tôi! +1
Dmytro

1
Đúng thứ tôi cần. Thông minh!
Thực tế Sự cố

1
Gần đây, tôi đã có một vị trí mà chrome đưa nội dung buồn cười vào khi loại nhập liệu là ngày tháng, tôi nghĩ là một phần của html5, tôi muốn sử dụng jquery datepicker vì vậy tôi đã sử dụng DataType.Text - điều đó vẫn cho phép tôi sử dụng định dạng đủ thú vị
John

2
Không cần phải xin lỗi vì đến muộn, đăng câu trả lời cho các câu hỏi cũ có thể là một trợ giúp tuyệt vời cho những người không phải là OP. Đây là câu trả lời mà tôi đang tìm kiếm vì tôi biết là có thể nhưng không thể nhớ bằng cách nào, và bạn đã đăng nó 3 năm trước. Nếu bất cứ điều gì bạn đang cực kỳ sớm.
RyanfaeScotland

nếu ngày xuất phát từ một cơ sở dữ liệu tôi không biết làm thế nào điều này có thể giúp ... không thể tìm ra nó
Antoine Pelletier

41

Điều này hoạt động nếu bạn muốn hiển thị trong TextBox:

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

ngày sẽ được hiển thị không chính xác nếu trình duyệt có định dạng khác trong cài đặt với "dd-MM-yyyy", tức là "MM-dd-yyyy"
Oleg Sh

16

Ngày / giờ trong datebase hoàn toàn không phải là một phiên bản được định dạng . Nó sẽ chỉ là ngày / giờ. Cách bạn hiển thị ngày / giờ đó khi bạn trích xuất giá trị từ cơ sở dữ liệu là một vấn đề khác. Tôi thực sự nghi ngờ bạn thực sự chỉ muốn:

model.Returndate = DateTime.Now.Date;

hoặc có thể

model.Returndate = DateTime.UtcNow.Date;

Có, nếu bạn xem cơ sở dữ liệu bằng SQL Server Studio hoặc bất cứ thứ gì, bây giờ bạn sẽ thấy nửa đêm - nhưng điều đó không liên quan và khi bạn tìm nạp ngày ra khỏi cơ sở dữ liệu và hiển thị cho người dùng, thì bạn có thể áp dụng định dạng liên quan .

CHỈNH SỬA: Đối với câu hỏi đã chỉnh sửa của bạn, vấn đề không phải ở mô hình - đó là cách bạn chỉ định chế độ xem. Bạn nên sử dụng một cái gì đó như:

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

nơi dngày tháng và thời gian tiêu chuẩn format specifier cho mẫu ngày ngắn (có nghĩa là nó sẽ tính đến cài đặt văn hóa hiện tại).

Đó là điều tôi đã nói nhiều lần - đó là khi bạn hiển thị ngày / giờ cho người dùng , đó là lúc để định dạng nó thành một ngày không có thời gian.

CHỈNH SỬA: Nếu cách này không hiệu quả, nên có cách trang trí mô hình hoặc chế độ xem bằng chuỗi định dạng - hoặc thứ gì đó tương tự. Tôi thực sự không phải là người của MVC, nhưng có vẻ như phải có một cách tốt để làm điều này một cách khai báo ...


DateTime.Now.Date vẫn hiển thị thời gian cùng với ngày tháng.
ZVenue

1
@ZVenue: Hiển thị nó ở đâu? Bạn nên lưu trữ giá trị DateTime và sử dụng công cụ định dạng chỉ ngày ở bất kỳ nơi nào bạn đang hiển thị ngày. Mã bạn đã cung cấp (đặt thuộc tính trong mô hình) có lẽ là để lưu trữ, vì vậy không có vấn đề gì khi nó có thời gian là nửa đêm.
Jon Skeet

Jon gợi ý những gì tôi đang nói, lưu ngày vào SQL như hiện tại; sau đó bạn có thể chỉ cần định dạng ngày của mình một cách thích hợp khi bạn in nó.
Russ Clarke,

2
@Jon: Tôi gặp lỗi này khi sử dụng mã chỉnh sửa của bạn cho html.editorfor .... "Chỉ có thể sử dụng các mẫu với quyền truy cập trường, truy cập thuộc tính, chỉ mục mảng một chiều hoặc biểu thức trình lập chỉ mục tùy chỉnh một tham số". ... at run time
ZVenue 19/08

1
@ZVenue: Hãy xem cái này nữa: stackoverflow.com/questions/5033902/…
Jon Skeet vào

8

Bạn có thể sửa đổi ViewModel của mình như sau:

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

Giải pháp này cũng giải quyết vấn đề xung đột trình chọn ngày của Chrome. Nếu bạn chỉ định Datatype.Date trong Viewmodel, thì Chrome sẽ sử dụng phiên bản datepicker của riêng nó trong hộp văn bản. Cảm ơn bạn!
Katherine

7

Bạn có thể áp dụng định dạng ngày giờ tùy chỉnh bằng cách sử dụng ToStringnhư:

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

Đọc thêm về DateTime.ToStringmẫu định dạng có thể được tìm thấy ở đâyở đây .

Chỉnh sửa: Sau khi chỉnh sửa câu hỏi của bạn, Cũng giống như những gì đề xuất khác, bạn nên áp dụng định dạng ngày ở chế độ xem của mình:

model.Returndate = DateTime.Now.Date;

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

1
điều đó sẽ không giúp được vấn đề lưu ngày.
Russ Clarke

Anh ấy không thể cứu nó bằng cách gọi điện model.Returndate.ToString("mm/dd/yyyy")?
Jalal nói

Đó là một vấn đề .. Tôi đang đặt giá trị đó trong trường datetime trong db. Vì vậy, điều này sẽ không hoạt động..Xin vui lòng xem bài viết gốc của tôi.
ZVenue

Không nên là .ToString ("MM / dd / yyyy")? mm là phút, không phải tháng!
Bodrick

@Bodrich: cảm ơn, đã cập nhật, tôi chỉ sao chép và dán mẫu của anh ấy.
Jalal nói

4

Tôi không chắc trong Razor nhưng trong ASPX bạn làm:

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

Phải có một cái gì đó tương tự trong Razor. Hy vọng rằng điều này sẽ giúp một ai đó.


1
Yep này cũng sẽ làm việc trong Razor cú pháp, ví dụ như @ Html.Encode (string.Format ( "0: D", item.Modify_Date))
Ciaran Gallagher

4

Nếu bạn có vòng lặp for chẳng hạn như vòng lặp bên dưới.

Thay đổi @ item.StartDate thành @ item.StartDate.Value.ToShortDateString ()

Điều này sẽ loại bỏ thời gian trong trường hợp bạn không thể chú thích thuộc tính của mình trong mô hình như trường hợp của tôi.

<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

Bao gồm Chú thích dữ liệu như DisplayFormat và ApplyFormatInEditMode để có đầu ra mong muốn.

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

Bây giờ ngày hóa đơn của bạn sẽ hiển thị như thế nào.

nhập mô tả hình ảnh ở đây


Xin hãy xem các câu trả lời khác. Bạn có nghĩ rằng nội dung của bạn là cần thiết và thêm một số nội dung chất lượng mới vào bài đăng?
L. Guthardt

1

Bạn chỉ cần chuyển đổi ngày giờ. Cái gì đó như:

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

1

Tôi gặp một số vấn đề với các giải pháp khác trên trang này, vì vậy tôi nghĩ rằng tôi sẽ bỏ qua.

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

Vì vậy, bạn chỉ cần thêm "{0: d}" vào tham số thứ hai và bạn đã sẵn sàng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.