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ờ.
date
cho 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ứ datetime
mang 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. Datetime
có thể cứu bạn ở đó, hoàn toàn date
không thể, và sẽ trở nên khó sửa chữa nếu bạn bắt đầu viết date
sai 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ì value
bạn muốn.
DateTimeKind.Unspecified
khi đượ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.Unspecified
vì đ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);
}
DateTime
với các thiết lập thời gian để 00:00:00
Không có Date
DataType.
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.Date
giống như DateTime.Today
. Có một DateTime.UtcNow
trả 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.Date
là 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 DateTime
loại có một .Date
tài sản mà trả về DateTime
vớ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.