Дата vs DateTime


110

Я працюю над програмою, яка вимагає повернення дати події.

Я шукаю Date, а не DateTime.

Чи існує тип даних, який повертає лише дату?

Відповіді:


131

Ні, немає. DateTimeявляє собою деякий момент часу, який складається з дати та часу. Однак ви можете отримати частину дати за допомогою Dateресурсу (який інший DateTimeіз встановленим часом 00:00:00).

І ви можете отримати окремі властивості дати за допомогою Day, Monthі Year.


23

Я створив просту структуру дат для тих часів, коли вам потрібна проста дата, не турбуючись про часовий проміжок часу, часові пояси, локальні та utc тощо.

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
Дякую! Це корисно.
гарфбрадаз

16

На жаль, не в .Net BCL. Дати зазвичай представлені у вигляді об'єкта DateTime із часом, встановленим на півночі.

Як ви можете здогадатися, це означає, що навколо вас є всі супутні проблеми часового поясу, навіть якщо для об'єкта Date ви не хочете обробляти часовий пояс.


1
Якщо ви використовуєте значення DateTime в якості дати, встановіть Kind на UTC. Немає коригувань часового поясу. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000

Так, я можу сказати з досвіду, що використовувати що- dateнебудь є поганою ідеєю, якщо ви не на 100% впевнені, що ваш додаток працюватиме лише в одному часовому поясі. Збереження всього, що datetimeдає найкраще з обох країн, у тому числі найважливіше, простий спосіб уникнути кошмарів часового поясу, якщо конфігурації часового поясу вашого сервера колись змінюються ... і починає записувати дані так, як ви цього не передбачали. Datetimeможе зберегти вас там, dateзовсім не може, і вам стане важко виправити, якщо ви коли-небудь почнете записувати dateз неправильним контекстом часового поясу.
Келсі Ханнан

2
@KelseyHannan, якщо, звичайно, ви не маєте справу з такими речами, як "дата народження" або "дата придбання", де ви явно не хочете, щоб речі таємничо змінювались днями лише тому, що ви переїхали в країни. Як скажімо, обробка ірландських іпотечних заявок у Новій Зеландії як невипадковий приклад.
Роджер

9

Створіть клас обгортки. Щось на зразок цього:

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;
    }

І виставляй все, що valueти хочеш.


4
Я хотів би запропонувати , що ваш конструктор повинен встановити DateTime.Kind до DateTimeKind.Unspecifiedтак що , коли він отримує серіалізовать десеріалізациі без перетворення (дата може змінюватися в залежності від різних в часових поясах).
oatsoda

1
@OffHeGoes Встановіть DateTime.Kind на DateTimeKind.Utc. Не встановлюйте це, DateTimeKind.Unspecifiedоскільки це гарантуватиме його серіалізацію / дезаріалізацію із включеним зміщенням часового поясу! Дата календаря однакова незалежно від часового поясу, тому не дозволяйте системі її коригувати.
Suncat2000

5

Тип дати - це лише псевдонім типу DateTime, який використовується VB.NET (наприклад, int стає Integer). Обидва ці типи мають властивість Date, яка повертає вам об’єкт із часовою частиною, встановленою на 00:00:00.


1
Правда. Сторінка doc MSDN для VB.NET типу дати говорить: Відповідним типом у .NET Framework є структура System.DateTime .
miroxlav

4

DateTime має властивість Date , яку можна використовувати для ізоляції частини дати. Метод ToString також робить хорошу роботу лише відображати частину дати, коли частина часу порожня.


3

Об'єкт DateTime має властивість, яка повертає лише частину значення значення.

    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з часом, встановленим на 0:00:00
Serj Sagan

3

Немає DateDataType.

Однак ви можете використовувати, DateTime.Dateщоб отримати просто Дату.

EG

DateTime date = DateTime.Now.Date;

Існує структура дати, а об'єкти можуть бути оголошені як тип дати.
Калеб Андерсон

@KalebAnderson не в застосуванні за замовчуванням .NET, немає. Якщо ви говорите про дату VB.net, це все-таки DateTime.
Нік Н.

DateTime.Now.Dateте саме, що DateTime.Today. Існує таке, DateTime.UtcNowщо повертає значення дати та часу як універсальний час (UTC), але немає методу чи властивості, еквівалентного UTC, на сьогодні; DateTimeKind.UtcNow.Dateє відповідним виразом.
Suncat2000

2

Ви можете повернути DateTime там, де частина часу 00:00:00, і просто проігнорувати його. Дати обробляються як цілі позначки часових позначок, тому є сенс поєднувати дату з часом, який так чи інакше присутній у цілому.


2

Для цього потрібно використовувати дату, але ігнорувати значення часу.

Зазвичай датою буде DateTime з часом 00:00:00

DateTimeТип має .Dateвластивість , яке повертає DateTimeдо встановленого значенням часу , як зазначено вище.


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

        set 
        { 
            TheDate = value; 
        } 
    }    
}

4
Пояснення вашої відповіді було б корисно.
Гуансі

0

Ви можете спробувати одне з наступного:

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

Але типу "Дата" в BCL немає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.