2012-08-12 20 views
5

Kullanıcı, metin kutusuna ayrı bir tarih ve saat girer. Sonra tarih ve saati datetime olarak birleştiririm. Veritabanına kaydetmek için bu tarih saatini UTC'ye dönüştürmem gerekiyor. Kullanıcının saat dilimi kimliğini veritabanında saklıyorum (kayıt olduklarında seçtiler). Bu bir istisna sonuçlandıKullanıcı tarafından UTC'ye girilen datetime dönüştürme

string userTimeZoneID = "sometimezone"; // Retrieved from database 
TimeZoneInfo userTimeZone = TimeZoneInfo.FindSystemTimeZoneById(userTimeZoneID); 

DateTime dateOnly = someDate; 
DateTime timeOnly = someTime; 
DateTime combinedDateTime = dateOnly.Add(timeOnly.TimeOfDay); 
DateTime convertedTime = TimeZoneInfo.ConvertTimeToUtc(combinedDateTime, userTimeZone); 

: Birincisi, şu çalıştı

Sonra şöyle Kind özelliği ayarlama çalıştı

The conversion could not be completed because the supplied DateTime did not have the Kind property set correctly. For example, when the Kind property is DateTimeKind.Local, the source time zone must be TimeZoneInfo.Local

:

DateTime.SpecifyKind(combinedDateTime, DateTimeKind.Local); 

Bu vermedi iş, bu yüzden denedim:

DateTime.SpecifyKind(combinedDateTime, DateTimeKind.Unspecified); 

Bu, işe yaramadı. Yapmam gerekeni kimse anlatabilir mi? Bu şekilde doğru yoldan mı gidiyorum? DateTimeOffset kullanmalı mıyım?

+0

olası yinelenen (http://stackoverflow.com/questions/4668921/convert-local-time deneyebilirsiniz -to-utc-in-net-framework-3-0) – Shai

+0

@Shai: Açıkçası, bu sorunun sahip olduğu gibi bir yinelenen: ".NET framework 3.0'da kullanmalıyım, bu yüzden TimeZoneInfo nesnesini kullanamıyorum." –

+0

@JonSkeet Ahhh bunu görmedi, OP'ye bir kurşun verebilirdi .. – Shai

cevap

7

Sadece tüm diğer yöntemler DateTime üzerine, SpecifyKind bir mevcut değerini değiştirmez gibi - bir yeni değer döndürür. Sen gerekir:

combinedDateTime = DateTime.SpecifyKind(combinedDateTime, 
             DateTimeKind.Unspecified); 

Şahsen benim oldukça önyargılı görünümde oldukça net bu tür şeyleri (Ben ana yazarım) yapar Noda Time kullanarak öneriyoruz. Bunun yerine bu kod ile bitirmek istiyorum:

DateTimeZone zone = ...; 
LocalDate date = ...; 
LocalTime time = ...; 
LocalDateTime combined = date + time; 
ZonedDateTime zoned = combined.InZoneLeniently(zone); 
// You can now get the "Instant", or convert to UTC, or whatever... 

belirli bir bölgeye lokal kez dönüştürdüğünüzde, yerel değer nedeniyle saat diliminde geçersiz veya belirsiz olduğu için olasılık var, çünkü "yumuşak" bir parçasıdır DST değişiklikleri.

+0

Teşekkürler Jon! Bu kadar basit olduğuna inanamıyorum! Noda Time'ı kontrol edeceğim çünkü kullanımı çok daha kolay görünüyor! – HTX9

+0

@ HTX9: Goodo - başlangıçta aslında daha karmaşık bir şey olduğunu fark edebilirsiniz, çünkü gerçekte ne tür bir veriye sahip olduğunuza (yerel, tarihler vs zaman/tarih vs), belirsizlikle nasıl başa çıkılacağına dair sizi zorlar. Bunlar zaten düşünmeniz gereken şeylerdir, ancak .NET API bunları tespit etmeyi zorlaştırır. Bu teori, her neyse :) –

1

Ayrıca [.NET framework 3.0 UTC yerel saati dönüştürme] Bu

var combinedLocalTime = new DateTime((dateOnly + timeOnly.TimeOfDay).Ticks,DateTimeKind.Local); 
var utcTime = combinedLocalTime.ToUniversalTime(); 
İlgili konular