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?

TuanM
sumber

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.

Ronald Wildenberg
sumber
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

Tanah liat
sumber
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.

Jonathan Rupp
sumber
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.

Øyvind Skaar
sumber
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
5

Tipe Tanggal hanyalah alias dari tipe DateTime yang digunakan oleh VB.NET (seperti int menjadi Integer). Kedua tipe ini memiliki properti Tanggal yang mengembalikan Anda objek dengan bagian waktu diatur ke 00:00:00.

stevehipwell.dll
sumber
1
Benar. Halaman doc MSDN untuk VB.NET Date type mengatakan: Jenis yang sesuai dalam .NET Framework adalah struktur System.DateTime .
miroxlav
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.

C. Ross
sumber
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);
}
hmcclungiii
sumber
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;
Nick N.
sumber
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.

Mikko Rantanen
sumber
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.

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

        set 
        { 
            TheDate = value; 
        } 
    }    
}
William Mendoza
sumber
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.

Andrew Hare
sumber