Xamarin.ios 从NSDate值获取日期部分

Xamarin.ios 从NSDate值获取日期部分,xamarin.ios,nsdate,uidatepicker,Xamarin.ios,Nsdate,Uidatepicker,我正在使用UIDatePicker,在MonoTouch中将此数据转换为System.DateTime值时遇到问题。从NSDate到DateTime的转换存在一些问题,我已经基本解决了这些问题,但现在我发现,如果您选择的日期不在同一夏令时内,那么您可以休息一小时。例如,如果我选择2010年1月的日期,我将有一个抵销问题 我想做的是,当用户从UIDatePicker中选择日期/时间时,获取NSDate的年、月、日、小时和分钟值,然后使用这些值创建一个新的System.DateTime,我将始终确保

我正在使用UIDatePicker,在MonoTouch中将此数据转换为System.DateTime值时遇到问题。从NSDate到DateTime的转换存在一些问题,我已经基本解决了这些问题,但现在我发现,如果您选择的日期不在同一夏令时内,那么您可以休息一小时。例如,如果我选择2010年1月的日期,我将有一个抵销问题

我想做的是,当用户从UIDatePicker中选择日期/时间时,获取NSDate的年、月、日、小时和分钟值,然后使用这些值创建一个新的System.DateTime,我将始终确保获得与用户在UIDatePicker中看到的完全相同的日期值

如何将NSDate值分解为不同的日期部分


谢谢。

这似乎可以使用
NSDateComponents
的实例来完成。以下内容已从中复制:

把日期分解成组成部分 组件,则使用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];
好的,通过使用上面的代码,您可以将NSDate转换为DateTime,就像您在.Net World:)上通常所做的那样,然后使用>DateTimeToNSDate可以将其还原为NSDate

希望这有帮助


Alex

解决夏令时问题的简单方法是将时区设置为GMT。然后UIDatePicker将忽略夏令时:

    _datePicker.TimeZone = NSTimeZone.FromAbbreviation("GMT");
在Monotouch中,NSDate与DateTime之间的隐式转换非常好,但您必须注意,NSDate始终是UTC时间,并且DateTime默认设置为DateTimeKind.UNNOTENCED(从数据库读取时)或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);

这比获取单独的日、月和年值更容易、更可靠。

如果有人能帮助我使用MonoTouch计算NSDate组件,我将不胜感激。我还没有弄明白怎么做。样本代码将不胜感激。非常感谢。
    // 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);