【问题标题】:Get Date Parts from a NSDate value从 NSDate 值中获取日期部分
【发布时间】:2010-08-02 23:44:20
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 如果有人可以帮助我使用 MonoTouch 找出 NSDateComponents,我将不胜感激。我还没有弄清楚如何做到这一点。示例代码将不胜感激。谢谢!

标签: xamarin.ios nsdate uidatepicker


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    看来这可以使用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];
    

    【讨论】:

      【解决方案3】:
      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

      希望对你有帮助

      亚历克斯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多