2015-04-17 22 views
5

Tamam, Orta Standart Saat Dilimi'nde barındırılan bir web sunucum var. IIS sunucusu, Saat Dilimi ile yapılandırılır, bu nedenle sunucuda DateTime.Now kullanıldığında veya tür Yerel olduğunda yeni bir DateTime oluşturulduğunda, Merkezi saatte olur. Sorun şu ki, site (ulusal) bir uygulamadır ve ABD veya Kanada'nın herhangi bir yerinde müşterilerimiz olabilir. Sitenin sahip olduğu şeylerden biri, randevuları planlamak için bir çeşit "Zamanlayıcı" dır. Tüm DateTime değerlerini veritabanında UTC biçiminde depolamak ve API içindeki ve dışındaki tüm trafiğin UTC'de de yer alması için geliştirme kolaylığına karar verdik. Sorun şu ki, sunucu tarafında tarih/saat değerleri oluşturduğumda sık sık sorunlarla karşılaşıyorum. Örneğin, saat 8'de sunucudaki Pasifik Standart Saati bölgesinde istemci için bir randevu programlı olarak oluşturmalıyım. Geçmişte, böyle şeyler yapmış:DateTime, belirli bir saat diliminden Nodatime kullanarak UTC'ye dönüştürülür.

var appointment = new new DateTime(2015, 04, 17, 08, 00, 00, DateTimeKind.Unspecified) 
var utcAppointment = TimeZoneInfo.ConvertTimeToUtc(appointment, 
         TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")) 

Diğer tarih/saat manipülasyonlara çok yanı olan programım yapmak ve sadece yerine Nodatime gitmeyi düşünüyorum. UTC DateTime'ı Nodatime değişkeninden oldukça kolay bir şekilde alabileceğimi biliyorum. Kafam karıştığı şey, belirli bir tarih/saatte belirli bir saat dilimi için Nodatime değişkeninin nasıl oluşturulacağıdır? Gördüğüm tüm örnekler, Desenler ve okuma dizeleriyle veya esasen "Şimdi" olan bir Anında oluşturma ile ilgili. Var olan BCL DateTime nesnesini "Tür" e bakmaksızın almak ve onu ayarladığım belirli saat dilimine sahip bir Nodatime nesnesine dönüştürmek gibi bir şey yapmak istiyorum.

Sanırım Nodatime harika bir kütüphanedir, ancak kullanıcı kılavuzunu okumak bana kafamı BCL'nin içine ve dışına dönüştürmeyi bıraktı.

+0

Benzer bir şey sordum [here] (http://stackoverflow.com/q/7553997/397817) ama aslında bir NodaTime sorusu değildi. Tartışma, bu sorunun gelecekteki okuyucularına yardımcı olabilir. Ayrıca, Jon Skeet'in uygun olan yerlerde Web API'sinde NodaTime türlerini kullanma önerisini de yapabilirim. zamanlamanızın zaman kısmı için bir LocalTime - seri hale getirme için bir yardımcı kütüphanesi bile var, NodaTime.Serialization.JsonNet. –

cevap

9

Kafam karıştığım şey, belirli bir tarih/saatte belirli bir saat dilimi için Nodatime değişkeninin nasıl oluşturulacağıdır? Nispeten kolay

:

LocalDateTime local = new LocalDateTime(2015, 4, 17, 8, 0, 0); 
DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/Los_Angeles"]; 
ZonedDateTime zonedTime = local.InZoneLeniently(zone); 

"yumuşak" kısmı gerçekten 08:00 atlanır veya belirsiz olduğu ortaya çıkarsa ne istediğinize bağlıdır - ki bu durumda olmayacak ama akılda tutulması gereken bir şey. Noda Time, bununla çeşitli şekillerde uğraşmanıza izin verir - user guide daha fazla ayrıntıya girer.

Dönüştürmeyi yapan bölge açısından düşünmeyi tercih ederseniz, bunun yerine zone.AtLeniently(local) kullanabilirsiniz, bunlar kesinlikle eşdeğerdir.

+0

Varolan bir BCL DateTime nesnesine sahip olsaydım, LocalDateTime.FromDateTime (objectName) kullanabilir miyim? – SpaceCowboy74

+0

@ SpaceCowboy74: Evet, ancak Noda Time türlerini mümkün olduğunca yaygın olarak kullanmanızı tavsiye ederim. –

+0

Anlaşıldı. Sorun şu ki, dış güçler ve WebApi'nin kendisi, DateTime nesnelerini zaman zaman bana iletiyor. Bunları UTC'ye dönüştürmek için tüketmem gerek. Bazıları kum havuzuna aldım ve bunu yukarıdaki kodunuzla yapabildim ve ardından zonedTime'ı bir ToDateTimeUtc çağrısı ile EntityFramwork'e geçirdim. – SpaceCowboy74

İlgili konular