从NSDate值获取日期部分

时间:2010-08-02 23:44:21

标签: xamarin.ios nsdate uidatepicker

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

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

如何将NSDate值分解为各个日期部分?

谢谢。

3 个答案:

答案 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

希望这会有所帮助

亚历