Yanıtlar:
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
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.
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 .
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 .
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).
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.
Tarih türü, VB.NET tarafından kullanılan DateTime türünün yalnızca bir takma adıdır (int'in Tamsayı olması gibi). Bu türlerin her ikisi de, saat bölümü 00:00:00 olarak ayarlanmış nesneyi size döndüren bir Date özelliğine sahiptir.
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);
}
DateTime, saat 0:00:00 olarak ayarlanmış a döndürür
DateDataType yok .
Ancak DateTime.Datesadece Tarihi almak için kullanabilirsiniz .
ÖRNEĞİN
DateTime date = DateTime.Now.Date;
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.
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.
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.
public class AsOfdates
{
public string DisplayDate { get; set; }
private DateTime TheDate;
public DateTime DateValue
{
get
{
return TheDate.Date;
}
set
{
TheDate = value;
}
}
}
Aşağıdakilerden birini deneyebilirsiniz:
DateTime.Now.ToLongDateString();
DateTime.Now.ToShortDateString();
Ancak BCL'de "Tarih" türü yoktur.