2013-09-06 37 views
8

Monotouch UIDatePickerに1時間遅れている問題があります。私はこれがタイムゾーンまたはそれに類するものと関係していると思います。明示的に私のUIDatePickerのTimeZoneとLocaleを設定しようとしましたが、これは役に立たないようです。 ValueChangedハンドラでUIDatePickerのタイムゾーン問題日付:1時間が間違っています

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

次の行は1時間早いユーザーインターフェースで選択した時間よりも値を返します。

にValueChangedハンドラで
var date = DateTime.SpecifyKind((s as UIDatePicker).Date, DateTimeKind.Local).ToLocalTime(); 

私は二重のロケールとタイムゾーンいることをチェックしました設定されたものと同じです。 TimeZoneはヨーロッパ/ダブリンとロケールen_USです。私が欠けている別のステップがあります

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

: この情報はにより取得されましたか?

ありがとうございます! var date = DateTime ...

+0

夏時間の適用は可能でしょうか?これは時々あなたが経験しているように思われるような時差を引き起こすことがあります。 –

答えて

9

DatePickerから返される日付は、UTC形式です。 UTCを現地時間に変換する方法はいくつかあります。 thisとして、ToLocalTimeが最良の状態です。

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

これは正しい答えだと思います。元のコードでは、OPは 'DateTimeKind.Utc'の代わりに' DateTimeKind.Local'を指定しました。 'NSDate'はUTCを表しますが、変換によって' .Kind'が設定されないので、これを行う必要があります。 –

+0

しかし、datePicker.DateはNSDateであり、DateTime.SpecifyKindメソッドの最初のパラメータはDateTimeです... – leoneboaventura

3

、次の行を追加します。

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

夏時間は常に1時間単位で調整されるとは限りません。 http://www.timeanddate.com/time/dst/ http://infiniteundo.com/post/25509354022/more-falsehoods-programmers-believe-about-time-wisdom –

+0

確かに。それは迅速な修正です。むしろ、私はむしろ完全に間違っているよりも正しいでしょう。もちろん、タイムゾーンに基づいてDSTオフセットを使用することもできます。あなたはこれについて素晴らしい提案をしていますか?私は第二のリンクが好きですが、それは答えを出すものではありません。私たちには誤解があります。 – frogge

+0

答えは私の答えです。 DateFormatterを使用すると、DSTが処理されます。 –

2

夏時間とタイムゾーンを持つすべての私の問題の固定この魔法のようなコードです。あなたが助けを必要とする場合は書いてください

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

このコードは不要な複雑さを追加します。あなたのローカルタイムゾーンに時間を変換したい場合は、単にDateTime.ToLocalTime()を使用してください。 –

関連する問題