Câu trả lời:
Tôi đã tạo cấu trúc Ngày đơn giản cho những lúc bạn cần một ngày đơn giản mà không cần lo lắng về phần thời gian, múi giờ, cục bộ 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
Thật không may, không có 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 người phục vụ xung quanh nó, mặc dù đối với đối tượng Date, bạn hoàn toàn không muốn xử lý múi giờ.
datecho bất kỳ thứ gì là một ý tưởng tồi trừ khi bạn chắc chắn 100% rằng ứng dụng của mình sẽ chỉ hoạt động trong một múi giờ. Lưu mọi thứ datetimemang lại cho bạn những gì tốt nhất của cả hai thế giới, bao gồm cả những điều quan trọng nhất, một cách dễ dàng để tránh gặp ác mộng múi giờ nếu cấu hình múi giờ của máy chủ của bạn thay đổi ... và bắt đầu ghi dữ liệu theo những cách bạn không lường trước được. Datetimecó thể cứu bạn ở đó, hoàn toàn datekhông thể, và sẽ trở nên khó sửa chữa nếu bạn bắt đầu viết datesai ngữ cảnh múi giờ.
Tạo một 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ì valuebạn muốn.
DateTimeKind.Unspecifiedkhi được tuần tự hóa, nó sẽ được deserialized mà không cần chuyển đổi (có thể thay đổi ngày dựa trên múi giờ khác nhau).
DateTimeKind.Utc. Không đặt nó thành DateTimeKind.Unspecifiedvì điều đó sẽ đảm bảo nó được tuần tự hóa / không hoạt động với độ lệch múi giờ đi kèm! Lịch ngày giống nhau bất kể múi giờ, vì vậy đừng để hệ thống điều chỉnh nó.
Kiểu Ngày chỉ là một bí danh của kiểu 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 Ngày trả về cho bạn đối tượng với phần thời gian được đặt thành 00:00:00.
DateTime có thuộc tính Ngày tháng mà bạn có thể sử dụng để tách biệt phần ngày tháng. Các ToString phương pháp cũng làm một công việc tốt chỉ hiển thị ngày một phần khi bán thời gian trống.
Đố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);
}
DateTimevới các thiết lập thời gian để 00:00:00
Không có DateDataType.
Tuy nhiên, bạn có thể sử dụng DateTime.Dateđể chỉ lấy Ngày.
VÍ DỤ
DateTime date = DateTime.Now.Date;
DateTime.Now.Dategiống như DateTime.Today. Có một DateTime.UtcNowtrả về giá trị ngày-giờ dưới dạng giờ quốc tế (UTC), nhưng không có phương thức hoặc thuộc tính tương đương UTC cho Hôm nay; DateTimeKind.UtcNow.Datelà biểu thức thích hợp.
Bạn có thể trả về DateTime trong đó phần thời gian là 00:00:00 và chỉ cần bỏ qua nó. Ngày tháng được xử lý dưới dạng số nguyên dấu thời gian, do đó, việc kết hợp ngày với thời gian vẫn có trong số nguyên là rất hợp lý.
Đố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à DateTime với thời gian 00:00:00
Các DateTimeloại có một .Datetài sản mà trả về DateTimevới các thiết lập giá trị thời gian như trên.
public class AsOfdates
{
public string DisplayDate { get; set; }
private DateTime TheDate;
public DateTime DateValue
{
get
{
return TheDate.Date;
}
set
{
TheDate = value;
}
}
}
Bạn có thể thử một trong những cách sau:
DateTime.Now.ToLongDateString();
DateTime.Now.ToShortDateString();
Nhưng không có loại "Ngày" trong BCL.