SORU
1 Temmuz 2011, Cuma


Sistem arasındaki fark.DateTime.Ve Sistemi artık.DateTime.Bugün

Herkes System.DateTime.Now c#.net System.DateTime.Today arasındaki farkı açıklayabilir mi? Her mümkünse artılarını ve eksilerini.

CEVAP
28 NİSAN 2013, Pazar


DateTime.Now kod çalıştığı bilgisayarın yerel tarih ve saat oluşur DateTime değerini döndürür. DateTimeKind.Local Kind özelliği atanmış. Aşağıdaki herhangi bir arama için eşdeğer

  • DateTime.UtcNow.ToLocalTime()
  • DateTimeOffset.UtcNow.LocalDateTime
  • DateTimeOffset.Now.LocalDateTime
  • TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local)
  • TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local)

DateTime.Today yukarıdaki ifadeler olarak aynı yıl, ay ve gün bileşenlere sahip DateTime değerini döndürür, ama zamanla bileşenleri sıfır olarak ayarlayın. Ayrıca DateTimeKind.Local Kind özelliği vardır. Aşağıdakilerden herhangi eşdeğerdir:

  • DateTime.Now.Date
  • DateTime.UtcNow.ToLocalTime().Date
  • DateTimeOffset.UtcNow.LocalDateTime.Date
  • DateTimeOffset.Now.LocalDateTime.Date
  • TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.Local).Date
  • TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.Local).Date

Not içten, sistem saati açısından UTC, o zaman sana haber DateTime.Now ilk aldığı UTC zaman () GetSystemTimeAsFileTime fonksiyonu win 32 API) ve sonra dönüştürür değeri için yerel saat dilimi. (DateTime.Now.ToUniversalTime() DateTime.UtcNow. daha pahalı bu yüzden)

Ayrıca unutmayın DateTimeOffset.Now.DateTime benzer değerler DateTime.Now, DateTimeKind.Unspecified yerine DateTimeKind.Local hangi yol açabilir diğer hataları bağlı olarak ne yapacaksın.

Bu yüzden, basit bir cevap DateTime.Today DateTime.Now.Date e denk gelir.
Ama IMHO - ya da bunlardan biri ya da yukarıdaki maddelerden herhangi kullanmamalısın.

DateTime.Now, istediğin zaman kod üzerinde çalıştığı bilgisayarın yerel takvim saatin değeri için soruyorsun. Ama geri almak ne saat hakkında herhangi bir bilgi yok! Alacağınız en iyi DateTime.Now.Kind == DateTimeKind.Local. Ama olan yerel mi? Bu Bilgi değeri, bir veritabanında depolamak ekranına, ya da bir web servisi kullanarak iletmek gibi bir şey yaparsan en kısa sürede kaybolur.

Eğer yerel saat dilimini her gün ışığından yararlanma kuralları izler, bu Bilgi DateTime.Now geri alamadım. Bir "fall-back" geçiş, DateTime.Now ile alınan. değere tekabül eden bilemezsin gibi sırasında belirsiz zamanlarda, Örneğin, diyelim ki sistem saat dilimi 37* *ayarlanır ve Kasım erken saatlerinde DateTime.Now sizden 3, 2013. Sonuç 2013-11-03 01:00:00 ne anlama geliyor? Anlık zaman iki anı aynı takvim datetime tarafından temsil edilmektedir. Eğer başka biri için bu değer göndersem, ne demek hiçbir fikirleri bile yok. Özellikle eğer kurallar farklı olduğu bir zaman dilimi.

Yapabileceğin en iyi şey DateTimeOffset yerine kullanmak olacaktır:

// This will always be unambiguous.
DateTimeOffset now = DateTimeOffset.Now;

Şimdi yukarıda anlattığım aynı senaryo, geçişten sonra geçiş ya 2013-11-03 01:00:00 -0700 önce 42* *değerini anlıyorum. Herkes bu değerlere bakarak ne demek istediğimi anlayabilirsiniz.

Bu konuyla ilgili bir blog yazısı yazdım. Lütfen okuyun - The Case Against DateTime.Now.

Ayrıca, "ileri bahar" geçiş tam Gece yarısı. olur da bu dünya (Brezilya gibi) bazı yerler vardır Saat 01:00 ile 23:59 arası. Bu değer, o tarihte DateTime.Today için almak anlamına gelirvar değil mi!Eğer DateTimeOffset.Now.Date, kullanıyorsanız bile aynı sonucu elde edersiniz, ve sen hala bu sorun var. Date bir nesne diye bir şey yok çünkü .Net. Yani ne olursa olsun nasıl elde değeri, bir kez soyunuyorsun zaman hatırlaman gereken bu değil gerçekten temsil "gece yarısı" bile olsa bu değer çalışıyorsun.

Eğer gerçekten bu sorunun tam doğru bir çözüm istiyorsanız, en iyi yaklaşım NodaTime kullanmaktır. LocalDate sınıfı düzgün bir zaman olmaksızın bir tarihi temsil eder. Herhangi bir zaman dilimi, yerel sistem zaman dilimi de dahil olmak üzere geçerli tarih:

using NodaTime;
...

Instant now = SystemClock.Instance.Now;

DateTimeZone zone1 = DateTimeZoneProviders.Tzdb.GetSystemDefault();
LocalDate todayInTheSystemZone = now.InZone(zone1).Date;

DateTimeZone zone2 = DateTimeZoneProviders.Tzdb["America/New_York"];
LocalDate todayInTheOtherZone = now.InZone(zone2).Date;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • Schmittastic Jr.

    Schmittastic

    19 Mart 2013
  • tsweeney79

    tsweeney79

    21 Ocak 2008