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
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.
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 UTCDateTime
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 sanagerekir
DateTimeOffset
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 de
DateTimeOffset
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 birineDateTime
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 bilgisayaraDateTime
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".
Bir DateTime nesnesi verildiğinde, nas...
SQLite karşılaştırma DateTime...
Ruby DateTime ve Zaman/dönüştür...
mysql datetime karşılaştırma...
Dize geçerli bir DateTime " tanınm...