我遇到了Monotouch UIDatePicker落后1小时的问题。我认为这与Time Zones或类似的东西有关。我已经尝试明确设置我的UIDatePicker的TimeZone和Locale,但这似乎没有帮助。
datePicker.Locale = NSLocale.CurrentLocale;
datePicker.TimeZone = NSTimeZone.LocalTimeZone;
在ValueChanged处理程序中,以下行返回的值比用户界面中选择的时间早1小时:
var date = DateTime.SpecifyKind((s as UIDatePicker).Date, DateTimeKind.Local).ToLocalTime();
在ValueChanged Handler中,我仔细检查过Locale和TimeZone是否与设置的相同。 TimeZone是欧洲/都柏林和Locale en_US。 该信息由以下人员检索:
datePicker.Locale.LocaleIdentifier;
datePicker.DatePicker.TimeZone;
我还缺少另一个步骤吗?
谢谢!
答案 0 :(得分:10)
DatePicker返回的日期是UTC格式。有几种将UTC转换为本地时间的方法。正如this回答说ToLocalTime是最好的。
DateTime.SpecifyKind(datePicker.Date, DateTimeKind.Utc).ToLocalTime();
答案 1 :(得分:3)
在var date = DateTime ...
之后,添加以下内容:
if (date.IsDaylightSavingTime ())
date = date.AddHours (1);
答案 2 :(得分: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;