首页 文章

从NSDate值获取日期部分

提问于
浏览
5

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

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

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

谢谢 .

3 回答

  • 1

    摆脱夏令时问题的一种简单方法是将时区设置为GMT . 然后UIDatePicker将忽略夏令时:

    _datePicker.TimeZone = NSTimeZone.FromAbbreviation("GMT");
    

    在Monotouch中,NSDate与DateTime的隐式转换非常好,但您必须注意NSDate始终是UTC时间,而DateTime默认设置为DateTimeKind.Unspecified(从数据库读取时)或DateTimeKind.Locale(使用DateTime设置时) . 今天) . 在没有复杂的时区计算的情况下进行转换的最佳方法是强制使用正确的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);
    

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

  • 4

    看来这可以使用 NSDateComponents 的实例来完成 . 已从Date Components and Calendar Units复制以下内容:

    要将日期分解为组成组件,请使用NSCalendar方法组件:fromDate: . 除了日期本身之外,还需要在NSDateComponents对象中指定要返回的组件 . 为此,该方法采用由Calendar Units常量组成的位掩码 . 无需指定任何组件而不是您感兴趣的组件 . 清单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];

  • 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转换为DateTime,就像通常在.Net World上做的那样:)然后使用> DateTimeToNSDate,您可以将其还原为NSDate

    希望这可以帮助

    亚历克斯

相关问题