SORU
2 Aralık 2010, PERŞEMBE


DateTime vs DateTimeOffset

Şu anda ile ilgili standart bir yol var .biz bunu bir DateTime UTC (DateTime kullanarak örneğin.biz Her zaman dilimini bilinçli bir şekilde net DateTimes: UtcNow), ve bir görüntü olduğunda, UTC geri kullanıcının yerel saate dönüştürmek.

Bu gayet iyi çalışıyor, ama nesnenin kendisi, yerel ve UTC zamanını yakalar nasıl DateTimeOffset ve okuyordum. Yani soru şu, zaten yapmakta olduğumuz şey DateTimeOffset vs kullanmanın avantajları ne olurdu?

CEVAP
10 Ocak 2013, PERŞEMBE


DateTimeOffset bir temsilidiranlık zaman. Bu, herkes için evrensel olan zaman içinde bir anı (görelilik için muhasebe değil). Anlık zaman temsil etmek için başka bir yol .Kind DateTimeKind.Utc DateTime ile.

Bu ayrıdırtakvim zamanbirinin takvim üzerinde bir konumu olan , ve birçok farklı takvimler var tüm dünyada. Bu takvimler diyoruzsaat dilimleri. Takvim Saat .Kind DateTimeKind.Unspecified DateTimeKind.Local DateTime ile temsil edilir. Ve .Local sonucu kullandığı bilgisayar konumlandırılmış nerede zımni bir anlayışa sahip senaryolarda anlamlı olur. (Örneğin, bir kullanıcının iş istasyonu)

Öyleyse, neden 10* *UTC yerine DateTimeOffset?Bakış açısına göre değişir.Hadi bir benzetme fotoğrafçılar gibi davranacağız kullanın.

Anlık zaman çizelgesi üzerinde bir kişi de kamera önünde ortaya koydu gösteren bir takvim çizelgesi üzerinde durup düşünün. Belli aralıklarla yaz saati veya saat dilimini yasal tanımı için diğer değişiklikler nedeniyle tasarruf nedeniyle değişen zaman dilimi kurallarına göre kamera Yukarı hattı. (Kamera sallanıyor çok istikrarlı bir el yok.)

Kişinin fotoğrafı duran bu sizin kamera geldi açısını görmek istiyorum. Eğer Diğerleri fotoğraf çekmek olsaydı, farklı açılardan olabilir. Bu DateTimeOffset Offset bölümünü temsil eder.

Eğer öyleyse sizin Etiket makinesi "Doğu Saati", bazen -5 bazen gelen işaret, işaret ediyorsunuz -4. Dünyanın her yerinde kameralar var, hepsi farklı şeyler etiketli ve hepsi aynı Anlık işaret farklı açılardan zaman çizelgesi. Bazıları yanına (veya üzerine) birbirlerine doğru, yani mahsup süresi ile ilgili olduğunu belirlemek için yeterli değil diyorlardı.

Ve UTC ne olacak? Peki, sarsılmaz bir ele sahip olmak için garantili bir kamera var. Bir tripod üzerinde, sağlam zemine sabitlenmiş. Bir yere gittiği yok. Perspektif açısı sıfır ofset diyoruz.

Instantaneous Time vs Calendar Time Visualization

Bu yüzden bu benzetme bize ne anlatıyor? Bazı sezgisel kurallar sağlar.

  • Eğer zaman belirli bir yere göre temsil eden, DateTime bir takvim zamanında temsil eder. Emin olun hiç bir takvim karıştırılmaz. Unspecified varsayım olmalıdır. Local yararlı DateTime.Now geliyor. Örneğin, DateTime.Now alın ve kaydedin veritabanında olabilirim - ama ben onu almak, Unspecified olduğunu sanıyorum. Benim yerel takvim başlangıçta alınan aynı takvim olduğunu güvenemiyorum.

  • Eğer her an belli olması gerekir, anlık saati gösteren emin olun. DateTimeOffset bunu uygulamak için kullanın, ya da UTC DateTime kongre tarafından kullanılıyor.

  • Eğer ani bir dakika izlemek gerekir, ama aynı zamanda bilmek istiyorum "Ne zaman kullanıcı kendi yerel takvim üzerinde miydi?" - o zaman sanagerekirDateTimeOffset kullanın. Bu zaman tutma sistemleri için çok önemli, teknik ve yasal endişelerinden dolayı örneğin.

  • Eğer hala yeni kullanıcı için uygun uzaklığı sağlamak için önceden kaydedilmiş DateTimeOffset - yeterli bilgi yok offset yalnız değiştirmeniz gerekirse. Gerekirayrıcazaman dilimi tanımlayıcı (eğer konumu değişmişse bile yeni bir resim çekebileyim - ihtiyacım olan kamera adı sanırım) saklayın.

    Ayrıca Noda Time süre gösterimi ZonedDateTime denir bunun için vardır, bu işaret edilmelidir .Net temel sınıf kütüphanesi benzer bir şey yok. DateTimeOffset TimeZoneInfo.Id bir değeri, bir de saklamak gerekir.

  • Bazen, yerel bir takvim zamanı ifade etmek için isteyeceksiniz "kim bakıyor". Örneğin, ne tanımlarkenbugündemektir. Bugün her zaman gece yarısına kadar gece yarısı olur, ama bu anlık zaman aralıkları örtüşen neredeyse sonsuz sayıda temsil eder. (Uygulamada var sınırlı sayıda dilimleri, ama ifade uzaklıklar aşağı kene) Yani bu gibi durumlarda, emin olun ne anladığınızı da limit "kim soruyor?" soru için tek bir zaman dilimi, ya da anlaşma ile onları geri çevirmek için anlık zaman uygun.

İşte bu benzetme tekrar DateTimeOffset ve düz tutmak için bazı ipuçları hakkında birkaç diğer küçük bit

  • Eğer DateTimeOffset iki değeri karşılaştırmak için, ilk önce karşılaştırma ofset sıfır normalleştirilmiş. Diğer bir deyişle, 2012-01-01T00:00:00 00:00 2012-01-01T02:00:00 02:00 anlık aynı anda bakın, ve bu nedenle eşdeğerdir.

  • Eğer yapıyorsanız, herhangi bir birim test ve ofset, test belirli olması gerekirher ikisi deDateTimeOffset değeri, ve .Offset özelliği ayrı.

  • Tek yönlü örtülü bir dönüşüm için inşa edilmiştir .Sağlayan Net çerçeve DateTimeOffset parametre veya değişken herhangi birine DateTime pas. Bunu yaparken,.Kind önemli. Eğer UTC bir türlü başarılı olursa, sıfır ofset taşımak olacaktır, ama ya .Local .Unspecified, iletirseniz olmak üstlenecekyerel. Çerçeve temelde söyleyerek, "Pekala, sen istedin beni dönüştürmek takvim zaman anlık zaman, ama hiçbir fikrim yok nerede bu geldi, bu yüzden ben burada kullanmak için yerel takvim." Bu, farklı bir zaman dilimi ile bir bilgisayara DateTime belirtilmeyen bir yük eğer büyük bir yakaladım. (IMHO - bir istisna atmak gerekir ama bir anlamı yok.)

Utanmaz Fiş:

Birçok kişi Pluralsight benim dersin, Date and Time Fundamentals ben dahil çok bu benzetme son derece değerli buldukları, o da benimle paylaştı. İkinci modülünde kamera benzetme adım adım örneklerde bulabilirsiniz, "İçerik Önemli", klipte "başlıklı Takvim Saat vs Anlık Zaman".

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bashirsultani

    bashirsultan

    22 Mart 2010
  • Ownage Pranks

    Ownage Prank

    13 AĞUSTOS 2007
  • Tahir Jahi

    Tahir Jahi

    6 Mart 2006