Tanggal vs DateTime


110

Saya sedang mengerjakan sebuah program yang membutuhkan tanggal suatu acara untuk dikembalikan.

Saya mencari Date, bukan DateTime.

Apakah ada tipe data yang mengembalikan tanggal saja?

Jawaban:


131

Tidak, tidak ada. DateTimemewakili beberapa titik waktu yang terdiri dari tanggal dan waktu. Namun, Anda dapat mengambil bagian tanggal melalui Dateproperti (yang lain DateTimedengan waktu yang diatur ke 00:00:00).

Dan Anda dapat mengambil properti tanggal individu melalui Day, Monthdan Year.


23

Saya membuat struct Tanggal sederhana untuk saat-saat ketika Anda memerlukan tanggal sederhana tanpa mengkhawatirkan porsi waktu, zona waktu, lokal vs. utc, dll.

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
Terima kasih! Itu berguna.
garfbradaz

16

Sayangnya, tidak ada di .Net BCL. Tanggal biasanya direpresentasikan sebagai objek DateTime dengan waktu yang disetel ke tengah malam.

Seperti yang bisa Anda tebak, ini berarti Anda memiliki semua masalah zona waktu petugas di sekitarnya, meskipun untuk objek Tanggal Anda sama sekali tidak menginginkan penanganan zona waktu.


1
Jika Anda menggunakan nilai DateTime sebagai Tanggal, atur Jenis ke UTC. Tidak ada penyesuaian zona waktu untuk ditangani. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000

Ya, saya dapat berbicara dari pengalaman bahwa menggunakan dateuntuk apa pun adalah ide yang buruk kecuali Anda 100% yakin aplikasi Anda hanya akan beroperasi dalam satu zona waktu. Menyimpan semuanya untuk datetimememberi Anda yang terbaik dari kedua dunia, termasuk yang paling kritis, cara mudah untuk menghindari mimpi buruk zona waktu jika konfigurasi zona waktu server Anda berubah ... dan mulai menulis data dengan cara yang tidak Anda antisipasi. Datetimedapat menyelamatkan Anda di sana, datetidak bisa sama sekali, dan akan menjadi sangat sulit untuk diperbaiki jika Anda mulai menulis datedengan konteks zona waktu yang salah.
Kelsey Hannan

2
@KelseyHannan kecuali tentu saja Anda berurusan dengan hal-hal seperti "tanggal lahir", atau "tanggal pembelian", di mana Anda secara eksplisit tidak ingin hal-hal secara misterius mengubah hari hanya karena Anda pindah negara. Misalnya, memproses aplikasi hipotek Irlandia di Selandia Baru sebagai contoh non-acak.
Roger Willcocks

9

Buat kelas pembungkus. Sesuatu seperti ini:

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

Dan ungkapkan apa pun yang valueAnda inginkan.


4
Saya akan menyarankan bahwa konstruktor Anda harus mengatur DateTime.Kind ke DateTimeKind.Unspecifiedsehingga ketika serial itu akan deserialized tanpa mengubah (mungkin mengubah tanggal berdasarkan yang berbeda dalam zona waktu).
oatsoda

1
@OffHeGoes Setel DateTime.Kind ke DateTimeKind.Utc. Jangan setel ke DateTimeKind.Unspecifiedkarena itu akan menjamin serialisasi / deserialisasi dengan offset zona waktu yang disertakan! Tanggal kalender tetap sama terlepas dari zona waktu, jadi jangan biarkan sistem menyesuaikannya.
Suncat2000


4

DateTime memiliki Tanggal properti yang dapat Anda gunakan untuk mengisolasi bagian tanggal. The ToString metode juga melakukan pekerjaan yang baik hanya menampilkan bagian Tanggal ketika paruh waktu kosong.


3

Objek DateTime memiliki properti yang mengembalikan hanya bagian tanggal dari nilai.

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

Jawaban ini salah. Tanggal mengembalikan a DateTimedengan waktu disetel ke 0:00:00
Serj Sagan

3

Tidak ada DateDataType.

Namun Anda dapat menggunakan DateTime.Datehanya untuk mendapatkan Tanggal.

MISALNYA

DateTime date = DateTime.Now.Date;

Ada struktur Tanggal, dan objek dapat dideklarasikan sebagai tipe Tanggal.
Kaleb Anderson

@KalebAnderson tidak dalam implementasi default .NET, tidak ada. Jika Anda berbicara tentang Tanggal VB.net, itu masih DateTime.
Nick N.

DateTime.Now.Datesama dengan DateTime.Today. Ada DateTime.UtcNowyang mengembalikan nilai tanggal-waktu sebagai waktu universal (UTC), tetapi tidak ada metode atau properti yang setara dengan UTC untuk Hari Ini; DateTimeKind.UtcNow.Dateadalah ekspresi yang tepat.
Suncat2000

2

Anda dapat mengembalikan DateTime di mana bagian waktunya adalah 00:00:00 dan abaikan saja. Tanggal ditangani sebagai bilangan bulat timestamp sehingga masuk akal untuk menggabungkan tanggal dengan waktu seperti yang ada dalam bilangan bulat.


2

Untuk ini, Anda perlu menggunakan tanggal, tetapi abaikan nilai waktu.

Biasanya tanggal akan menjadi DateTime dengan waktu 00:00:00

The DateTimejenis memiliki .Dateproperti yang mengembalikan DateTimedengan nilai waktu yang ditetapkan seperti di atas.


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

        set 
        { 
            TheDate = value; 
        } 
    }    
}

4
Memberikan penjelasan pada jawaban Anda akan membantu.
Guanxi

0

Anda dapat mencoba salah satu dari berikut ini:

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

Tapi tidak ada tipe "Tanggal" di BCL.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.