5

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

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

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

谢谢你。

4

3 回答 3

4

摆脱夏令时问题的一种简单方法是将时区设置为 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);

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

于 2011-03-18T23:32:02.557 回答
1

看来这可以使用NSDateComponents. 以下内容已从Date Components 和 Calendar Units复制:

要将日期分解为组成部分,请使用 NSCalendar 方法 components: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];
于 2010-08-03T00:20:45.950 回答
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

希望这可以帮助

亚历克斯

于 2011-02-03T16:51:02.097 回答