2009-04-28 56 views
74

Tôi đang làm việc trên một chương trình yêu cầu ngày của một sự kiện để được trả lại. Tôi đang tìm một "Ngày", không phải là "Ngày giờ". Có phải là một kiểu dữ liệu trả về chỉ là ngày ... là có?Ngày và Ngày giờ

Trả lời

93

Không có. DateTime đại diện cho một số điểm trong thời gian bao gồm một ngày và một thời gian. Tuy nhiên, bạn có thể truy xuất phần ngày qua thuộc tính Date (đây là một số khác DateTime với thời gian được đặt thành 00:00:00).

Và bạn có thể truy lục các thuộc tính ngày riêng lẻ qua Day, MonthYear.

1

Bạn có thể trả về DateTime khi phần thời gian là 00:00:00 và chỉ cần bỏ qua nó. Các ngày được xử lý dưới dạng số nguyên dấu thời gian, do đó, có ý nghĩa khi kết hợp ngày với thời gian như hiện tại trong số nguyên.

12

Thật không may, không phải trong .Net BCL. Ngày thường được biểu diễn dưới dạng đối tượng DateTime với thời gian được đặt thành nửa đêm.

Như bạn có thể đoán, điều này có nghĩa là bạn có tất cả các vấn đề về múi giờ của nhân viên xung quanh nó, mặc dù đối tượng Date bạn muốn hoàn toàn không xử lý múi giờ.

+0

Nếu bạn đang sử dụng một giá trị DateTime như một ngày, thiết lập Kind để UTC. Không có điều chỉnh múi giờ để xử lý. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc); – Suncat2000

+0

Vâng, tôi có thể nói từ kinh nghiệm sử dụng 'date' cho bất cứ điều gì là một ý tưởng tồi trừ khi bạn chắc chắn 100% ứng dụng của bạn sẽ chỉ hoạt động trong một múi giờ. Tiết kiệm mọi thứ dưới dạng 'datetime' mang lại cho bạn tốt nhất cả hai thế giới, bao gồm cả phê bình nhất, một cách dễ dàng để tránh những cơn ác mộng múi giờ nếu cấu hình múi giờ của máy chủ thay đổi ... và bắt đầu ghi dữ liệu theo cách bạn không lường trước được. 'Datetime' có thể cứu bạn ở đó,' ngày' không thể nào cả, và sẽ trở nên khó mà sửa được nếu bạn bắt đầu viết 'date' xuống với bối cảnh múi giờ sai. – Kelseydh

0

Bạn có thể thử một trong các cách sau:

DateTime.Now.ToLongDateString(); 
DateTime.Now.ToShortDateString(); 

Nhưng không có "Ngày" gõ vào BCL.

4

Loại ngày chỉ là bí danh của loại DateTime được VB.NET sử dụng (như int trở thành Số nguyên). Cả hai loại này đều có thuộc tính Date trả về cho bạn đối tượng có phần thời gian được đặt là 00:00:00.

+1

Đúng. [Trang tài liệu MSDN cho VB.NET Loại ngày] (http://msdn.microsoft.com/en-us/library/3eaydw6e.aspx) nói: * Loại tương ứng trong Khuôn khổ .NET là [System.DateTime] (http://msdn.microsoft.com/en-us/library/system.datetime.aspx) cấu trúc. * – miroxlav

3

Ngày giờ có thuộc tính Date mà bạn có thể sử dụng để tách biệt phần ngày. Phương thức ToString cũng thực hiện tốt công việc chỉ hiển thị phần Ngày khi phần thời gian trống.

1

Đối với điều này, bạn cần sử dụng ngày, nhưng bỏ qua giá trị thời gian.

Thông thường một ngày sẽ là một DateTime với thời điểm 00:00:00

Loại DateTime có một tài sản mà trả về DateTime với giá trị thời gian thiết lập như trên .Date.

1

Đối tượng DateTime có Thuộc tính chỉ trả về phần ngày của giá trị.

public static void Main() 
{ 
    System.DateTime _Now = DateAndTime.Now; 
    Console.WriteLine("The Date and Time is " + _Now); 
    //will return the date and time 
    Console.WriteLine("The Date Only is " + _Now.Date); 
    //will return only the date 
    Console.Write("Press any key to continue . . . "); 
    Console.ReadKey(true); 
} 
+0

Câu trả lời này không đúng. Ngày trả về một 'DateTime' với thời gian được đặt thành 0:00:00 –

7

Tạo lớp trình bao bọc. Một cái gì đó như thế này:

public class Date:IEquatable<Date>,IEquatable<DateTime> 
    { 
     public Date(DateTime date) 
     { 
      value = date.Date; 
     } 

     public bool Equals(Date other) 
     { 
      return other != null && value.Equals(other.value); 
     } 

     public bool Equals(DateTime other) 
     { 
      return value.Equals(other); 
     } 

     public override string ToString() 
     { 
      return value.ToString(); 
     } 
     public static implicit operator DateTime(Date date) 
     { 
      return date.value; 
     } 
     public static explicit operator Date(DateTime dateTime) 
     { 
      return new Date(dateTime); 
     } 

     private DateTime value; 
    } 

Và phơi bày bất cứ điều gì của value bạn muốn.

+0

ngầm và rõ ràng là sai? – Behrooz

+3

Tôi muốn đề xuất rằng hàm tạo của bạn nên đặt [DateTime.Kind] (http://msdn.microsoft.com/en-us/library/system.datetime.kind (v = vs.110) .aspx) thành 'DateTime.Kind ' DateTimeKind.Unspecified' để khi serialized nó được deserialized mà không cần chuyển đổi (có thể thay đổi ngày dựa trên khác nhau trong múi giờ). – OffHeGoes

+1

@OffHeGoes Đặt DateTime.Kind thành 'DateTimeKind.Utc'. * Không * đặt nó thành 'DateTimeKind.Unspecified' bởi vì điều đó sẽ đảm bảo nó được tuần tự hóa/deserialized với một bù đắp múi giờ bao gồm! Một ngày dương lịch là như nhau bất kể múi giờ, vì vậy đừng để hệ thống điều chỉnh nó. – Suncat2000

16

Tôi đã tạo đơn giản Date struct cho những lần bạn cần một ngày đơn giản mà không phải lo lắng về phần thời gian, múi giờ, địa phương so với utc, v.v.

Date today = Date.Today; 
Date yesterday = Date.Today.AddDays(-1); 
Date independenceDay = Date.Parse("2013-07-04"); 

independenceDay.ToLongString(); // "Thursday, July 4, 2013" 
independenceDay.ToShortString(); // "7/4/2013" 
independenceDay.ToString();  // "7/4/2013" 
independenceDay.ToString("s");  // "2013-07-04" 
int july = independenceDay.Month; // 7 

https://github.com/claycephus/csharp-date

+2

Cảm ơn! Điều đó rất hữu ích. – garfbradaz

1

Không có Date DataType.

Tuy nhiên bạn có thể sử dụng DateTime.Date để chỉ nhận ngày.

E.G.

DateTime date = DateTime.Now.Date; 
+0

Có cấu trúc Ngày tháng và các đối tượng có thể được khai báo là loại Ngày tháng. –

+0

@KalebAnderson không có trong thực thi mặc định .NET, không có. Nếu bạn đang nói về Ngày VB.net, đó vẫn là một DateTime. –

+0

'DateTime.Now.Date' giống với' DateTime.Today'. Có 'DateTime.UtcNow' trả về giá trị ngày-giờ làm thời gian quốc tế (UTC), nhưng không có phương thức hoặc thuộc tính tương đương UTC cho Today; 'DateTimeKind.UtcNow.Date' là biểu thức thích hợp. – Suncat2000

1
public class AsOfdates 
{ 
    public string DisplayDate { get; set; } 
    private DateTime TheDate; 
    public DateTime DateValue 
    { 
     get 
     { 
      return TheDate.Date; 
     } 

     set 
     { 
      TheDate = value; 
     } 
    }  
} 
+4

Đưa ra một số giải thích cho câu trả lời của bạn sẽ hữu ích. – Guanxi

Các vấn đề liên quan