2013-09-06 29 views
8

Monotouch UIDatePicker ile 1 saat geride kalan bir sorun yaşıyorum. Bunun Zaman Bölgeleri veya benzeri bir şeyle ilgili olduğunu düşünüyorum. Açıkça UIDatePicker'ımın TimeZone ve Locale ayarını denedim, ancak bu yardımcı olmadı. Çift Yerel ve zaman dilimi bunu kontrol ettik ValueChanged Handler olarakUIDatePicker ile saat dilimi sorunu Tarih: 1 Saat Yanlış

var date = DateTime.SpecifyKind((s as UIDatePicker).Date, DateTimeKind.Local).ToLocalTime(); 

: Aşağıdaki satırı önceki kullanıcı arabiriminde seçilen zamandan daha bir değer 1 saat döndürür ValueChanged işleyicisi

datePicker.Locale = NSLocale.CurrentLocale; 
datePicker.TimeZone = NSTimeZone.LocalTimeZone; 

ayarlanmış olanla aynı. TimeZone Avrupa/Dublin ve Locale en_US. Kaçırdığım bir adım var mı

datePicker.Locale.LocaleIdentifier; 
datePicker.DatePicker.TimeZone; 

: Bu bilgiler ile ele geçirildi?

Teşekkürler!

+0

Gün ışığından yararlanma etkin midir? Bu bazen karşılaştığınız şeylere benzer saat farklılıklarına neden olabilir. –

cevap

9

DatePicker döndürülen tarih UTC biçimindedir. UTC'yi yerel saate dönüştürmek için birkaç yöntem vardır. this yanıt olarak, ToLocalTime en iyisidir.

DateTime.SpecifyKind(datePicker.Date, DateTimeKind.Utc).ToLocalTime(); 
+1

Bence bu doğru cevap. Orijinal kodda OP, DateTimeKind.Utc yerine "DateTimeKind.Local" olarak belirtildi. Bir 'NSDate' UTC'yi temsil ettiğinden, dönüştürme '.Kind' ayarlanmadığından, bunu yapmanız gerekir. –

+0

Ancak datePicker.Date bir NSDate ve DateTime.SpecifyKind yönteminin ilk parametresi bir DateTime ... – leoneboaventura

3

var date = DateTime ... sonra aşağıdaki ekleyin:

if (date.IsDaylightSavingTime()) 
    date = date.AddHours (1); 
+0

Yaz saati uygulaması her zaman bir saat olarak ayarlanmaz. http://www.timeanddate.com/time/dst/ http://infiniteundo.com/post/25509354022/more-falsehoods-programmers-believe-about-time-wisdom –

+0

Gerçekten de. Bu hızlı bir düzeltme. Konuşmak için tamamen yanlış olmaktan ziyade neredeyse doğru olmayı tercih ederim. Tabii ki, saat dilimi temelinde bir DST ofsetini kullanabilirsiniz. Bunun için güzel bir teklifin var mı? İkinci bağlantıyı severim, ama hiçbir cevap vermez; sadece yanlış anlaşıldığımızı belirtir. – frogge

+0

Cevap cevabım aşağıda. DateFormatter kullanın, sizin için DST ilgilenir. –

2

Bu büyülü kod sabit tüm sorunlarımı Gün ışığından ve saat dilimleri ile. Yardıma ihtiyacınız varsa yazın.

NSDate sourceDate = date; 

NSTimeZone sourceTimeZone = new NSTimeZone ("UTC"); 
NSTimeZone destinationTimeZone = NSTimeZone.LocalTimeZone; 

int sourceGMTOffset = sourceTimeZone.SecondsFromGMT (sourceDate); 
int destinationGMTOffset = destinationTimeZone.SecondsFromGMT (sourceDate); 
int interval = destinationGMTOffset - sourceGMTOffset; 

var destinationDate = sourceDate.AddSeconds (interval); 

var dateTime = new DateTime(2001, 1, 1, 0, 0,0).AddSeconds(destinationDate.SecondsSinceReferenceDate); 

DescriptionLabel.Text = dateTime.ToString ("dd.MM.yyyy. HH:mm"); 
this.date = destinationDate; 
+1

Bu kod gereksiz karmaşıklık ekler. Yerel saat diliminize zaman dönüştürmek istiyorsanız, sadece DateTime.ToLocalTime() kullanın. –