Tarih vs DateTime


110

Döndürmek için bir olayın tarihini gerektiren bir program üzerinde çalışıyorum.

Ben a Datedeğil, a arıyorum DateTime.

Yalnızca tarihi döndüren bir veri türü var mı?

Yanıtlar:


131

Hayır yok. DateTimebir tarih ve bir saatten oluşan zamanın bir noktasını temsil eder. Ancak, tarih bölümünü Dateözellik aracılığıyla alabilirsiniz (bu, DateTimezamanın ayarlandığı başka bir şeydir 00:00:00).

Ayrıca Day, Monthve aracılığıyla ayrı tarih özelliklerini alabilirsiniz Year.


23

Zaman bölümü, saat dilimleri, yerel ve utc vb. Hakkında endişelenmeden basit bir tarihe ihtiyaç duyduğunuz zamanlar için basit bir Tarih yapısı oluşturdum .

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
Teşekkürler! Bu faydalıdır.
garfbradaz

16

Ne yazık ki, .Net BCL'de değil. Tarihler genellikle saat gece yarısına ayarlanmış bir DateTime nesnesi olarak temsil edilir.

Tahmin edebileceğiniz gibi, bu, bir Date nesnesi için kesinlikle hiçbir zaman dilimi işlemesi istemeseniz bile, etrafındaki tüm görevli zaman dilimi sorunlarının olduğu anlamına gelir.


1
Tarih olarak bir DateTime değeri kullanıyorsanız, Türü UTC olarak ayarlayın. Başa çıkacak saat dilimi ayarlaması yok. DateTime tarihi = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000

Evet, deneyimlerime dayanarak date, uygulamanızın yalnızca bir saat diliminde çalışacağından% 100 emin değilseniz, herhangi bir şey için kullanmanın kötü bir fikir olduğunu söyleyebilirim . Her şeyi olduğu gibi kaydetmek datetimesize en kritik olanlar da dahil olmak üzere her iki dünyanın da en iyisini sunar; sunucunuzun saat dilimi yapılandırmaları değiştiğinde saat dilimi kabuslarından kaçınmanın kolay bir yolunu sunar ... ve tahmin etmediğiniz şekillerde veri yazmaya başlar. Datetimesizi orada kurtarabilir date, hiç yapamaz dateve yanlış zaman dilimi bağlamıyla yazmaya başlarsanız, düzeltilmesi akıl almaz derecede zor hale gelir .
Kelsey Hannan

2
@KelseyHannan, tabii ki, sırf ülkeleri taşıdığınız için gizemli bir şekilde günlerin değişmesini istemediğiniz "doğum tarihi" veya "satın alma tarihi" gibi şeylerle uğraşmıyorsanız. Örneğin, İrlanda'daki ipotek başvurularının Yeni Zelanda'da işlenmesi rastgele olmayan bir örnek olarak.
Roger Willcocks

9

Bir sarmalayıcı sınıfı oluşturun. Bunun gibi bir şey:

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

Ve ne valueistersen açığa çıkar .


4
Yapıcınızın DateTime.Kind değerini DateTimeKind.Unspecified, serileştirildiğinde dönüştürmeden seri durumdan çıkarılacak şekilde ayarlamasını öneririm (farklı saat dilimlerine göre tarihi değiştirebilir).
oatsoda

1
@OffHeGoes DateTime.Kind öğesini ayarlayın DateTimeKind.Utc. Bunu olarak ayarlamayın, DateTimeKind.Unspecifiedçünkü bu, dahil edilen bir saat dilimi uzaklığıyla serileştirilmesini / serileştirilmemesini garanti eder! Bir takvim tarihi, saat diliminden bağımsız olarak aynıdır, bu nedenle sistemin bunu ayarlamasına izin vermeyin.
Suncat2000


4

DateTime, tarih bölümünü izole etmek için kullanabileceğiniz bir Date özelliğine sahiptir. ToString yöntemi aynı zamanda zaman parçası boşken sadece tarihi bölümünü gösteren iyi bir iş yapar.


3

DateTime nesnesi, değerin yalnızca tarih bölümünü döndüren bir Özelliğe sahiptir.

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

Bu cevap yanlıştır. Tarih DateTime, saat 0:00:00 olarak ayarlanmış a döndürür
Serj Sagan

3

DateDataType yok .

Ancak DateTime.Datesadece Tarihi almak için kullanabilirsiniz .

ÖRNEĞİN

DateTime date = DateTime.Now.Date;

Bir Date yapısı vardır ve nesneler Date türü olarak bildirilebilir.
Kaleb Anderson

@KalebAnderson varsayılan .NET uygulamasında değil, yok. VB.net Tarihinden bahsediyorsanız, bu hala bir DateTime.
Nick N.

DateTime.Now.Dateile aynıdır DateTime.Today. DateTime.UtcNowTarih-saat değerini evrensel saat (UTC) olarak döndüren bir vardır, ancak Today için UTC'ye eşdeğer bir yöntem veya özellik yoktur; DateTimeKind.UtcNow.Dateuygun ifadedir.
Suncat2000

2

Saat bölümü 00:00:00 olan DateTime'ı döndürebilir ve bunu göz ardı edebilirsiniz. Tarihler, zaman damgası tamsayıları olarak ele alınır, bu nedenle tarihi, tamsayıda olduğu gibi saatle birleştirmek mantıklıdır.


2

Bunun için tarihi kullanmanız gerekir, ancak zaman değerini göz ardı etmeniz gerekir.

Normalde tarih, saat ile bir DateTime olurdu 00:00:00

DateTimeTip sahip .Datedöner özelliği DateTimeyukarıdaki gibi zaman değeri kümesi ile.


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

        set 
        { 
            TheDate = value; 
        } 
    }    
}

4
Cevabınıza bir açıklama koymak yardımcı olacaktır.
Guanxi

0

Aşağıdakilerden birini deneyebilirsiniz:

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

Ancak BCL'de "Tarih" türü yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.