我正在使用UIDatePicker,我在将此数据转换为MonoTouch中的System.DateTime值时遇到问题。从NSDate到DateTime的转换存在问题,我已经解决了这个问题,但现在我看到如果您选择的日期不在同一个夏令时期间,那么您只需一小时。例如,如果我在2010年1月选择一个日期,我将有一个抵消问题。
我想做的是当用户从UIDatePicker中选择日期/时间时,获取NSDate的年,月,日,小时和分钟值,然后用这些创建一个新的System.DateTime价值,我将始终确保获得与用户在UIDatePicker中看到的完全相同的日期值。
如何将NSDate值分解为各个日期部分?
谢谢。
答案 0 :(得分:4)
摆脱夏令时问题的一种简单方法是将时区设置为GMT。然后UIDatePicker将忽略夏令时:
_datePicker.TimeZone = NSTimeZone.FromAbbreviation("GMT");
在Monotouch中,NSDate与DateTime的隐式转换非常好,但您必须知道NSDate始终是UTC时间,而DateTime默认设置为DateTimeKind.Unspecified(从数据库读取时)或DateTimeKind.Locale(当使用DateTime.Today设置)。 没有复杂的时区计算的最佳转换方法是强制使用正确的DateTimeKind:
// Set date to the date picker (_date is a DateTime with time part 0:00:00):
_datePicker.Date = DateTime.SpecifyKind(_date, DateTimeKind.Utc);
// Get the date from the date picker:
_date = DateTime.SpecifyKind(_datePicker.Date, DateTimeKind.Unspecified);
这比获取单独的日,月和年值更容易,更可靠。
答案 1 :(得分:1)
看来这可以使用NSDateComponents
的实例来完成。以下内容已从Date Components and Calendar Units复制:
将日期分解为成分 组件,您使用NSCalendar 方法组件:fromDate:。在 除了日期本身,你需要 指定要组件 在NSDateComponents中返回 宾语。为此,该方法需要一个 由日历单位组成的位掩码 常量。没有必要指定 比那些更多的组件 你感兴趣的。清单3 显示如何计算今天和 平日。
清单3 获取日期的组件
NSDate *today = [NSDate date]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today]; NSInteger day = [weekdayComponents day]; NSInteger weekday = [weekdayComponents weekday];
答案 2 :(得分:1)
public static DateTime NSDateToDateTime(MonoTouch.Foundation.NSDate date)
{
return (new DateTime(2001,1,1,0,0,0)).AddSeconds(date.SecondsSinceReferenceDate);
}
public static MonoTouch.Foundation.NSDate DateTimeToNSDate(DateTime date)
{
return MonoTouch.Foundation.NSDate.FromTimeIntervalSinceReferenceDate((date-(new DateTime(2001,1,1,0,0,0))).TotalSeconds);
}
通过使用上面的代码,你可以将NSDate转换为日常时间,就像你通常在.Net World上做的那样。然后使用> DateTimeToNSDate您可以将其还原为NSDate
希望这会有所帮助
亚历