Date so với DateTime


110

Tôi đang thực hiện một chương trình yêu cầu trả lại ngày diễn ra sự kiện.

Tôi đang tìm kiếm a Date, không phải a DateTime.

Có loại dữ liệu chỉ trả về ngày không?

Câu trả lời:


131

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

Và bạn có thể lấy tính ngày cá nhân thông qua Day, MonthYear.


23

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

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


2
Cảm ơn! Điều đó là hữu ích.
garfbradaz

16

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ờ.


1
Nếu bạn đang sử dụng giá trị DateTime làm Ngày, hãy đặt Loại thành UTC. Không có điều chỉnh múi giờ để giải quyết. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000

Vâng, tôi có thể nói từ kinh nghiệm rằng sử dụng 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ờ.
Kelsey Hannan

2
@KelseyHannan tất nhiên trừ khi bạn đang giải quyết những thứ như "ngày sinh" hoặc "ngày mua", nơi bạn rõ ràng không muốn mọi thứ thay đổi ngày một cách bí ẩn chỉ vì bạn đã chuyển quốc gia. Giống như nói, xử lý các đơn xin thế chấp của Ailen ở New Zealand như một ví dụ không ngẫu nhiên.
Roger Willcocks

9

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.


4
Tôi khuyên rằng phương thức khởi tạo của bạn nên đặt DateTime.Kind để 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).
Yenoda,

1
@OffHeGoes Đặt DateTime.Kind thành 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ó.
Suncat2000


4

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.


3

Đố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);
}

Câu trả lời này không chính xác. Ngày trả về một DateTimevới các thiết lập thời gian để 00:00:00
Serj Sagan

3

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;

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

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

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.
Suncat2000

2

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ý.


2

Đố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.


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ố lời giải thích cho câu trả lời của bạn sẽ hữu ích.
Guanxi

0

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.

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.