【问题标题】:Create NSDate Monotouch创建 NSDate Monotouch
【发布时间】:2010-01-27 17:18:58
【问题描述】:

我正在尝试获取日期字符串并将其转换为特定的 NSDate(例如 1981 年 7 月 1 日),但我没有看到设置日期的方法。有谁知道如何做到这一点?也许将 DateTime 对象转换为 NSDate?

【问题讨论】:

    标签: c# .net iphone xamarin.ios nsdate


    【解决方案1】:

    最简单的方法是从 DateTime 设置它。

    修订:NSDate 转换运算符现在是显式的,不再是隐式的!我更新了下面的示例。

    如果您查看 NSDate 原型,您会发现两个运算符:

        public static explicit operator NSDate(DateTime dt);
        public static explicit operator DateTime(NSDate d);
    

    这两个将为您完成转换。

    NSDate 与 DateTime 的显式转换非常好,但您必须注意 NSDate 始终是 UTC 时间,并且 DateTime 默认设置为 DateTimeKind.Unspecified(从数据库读取时)或 DateTimeKind.Locale(设置为日期时间。今天)。 无需复杂时区计算的最佳转换方法是强制使用正确的 DateTimeKind:

        // Set NSDate:
        DateTime date = DateTime.Parse("1981-07-01")
        NSDate nsDate = (NSDate)DateTime.SpecifyKind(date, DateTimeKind.Utc);
    
        // Get DateTime from NSDate:
        date = DateTime.SpecifyKind((DateTime)nsDate, DateTimeKind.Unspecified);
    

    【讨论】:

    • 我建议添加以下行,以确保您的转换正确date = date.ToLocalTime (); 除了您提到的内容之外,我还可以完美地工作。感谢您的指导。
    • date = DateTime.SpecifyKind(nsDate, DateTimeKind.Unspecified); 这对我来说给出了错误的日期
    • 我不明白 nsDate = DateTime.SpecifyKind 是如何工作的。 DateTime.SpecifyKind 返回一个日期,而不是 NSDate。
    • @VictorChelaru:转换是使用 NSDate 中的运算符完成的。它们曾经是隐式的,但在新的 Xamarin api 中它们是显式的。我更新了答案。
    • @MarcelW:哪种解决方案更好?你的还是显式转换described here?你的方法有什么不同?
    【解决方案2】:
    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);
    }
    

    这应该会有所帮助

    亚历克斯

    【讨论】:

    【解决方案3】:

    试试这个:

    private static NSDate DateTimeToNSDate(DateTime date)
        {
            NSCalendar calendar = NSCalendar.CurrentCalendar;
            NSDateComponents comps = new NSDateComponents();
            comps.Day = date.Day;
            comps.Month = date.Month;
            comps.Year = date.Year;
            comps.Minute = date.Minute;
            comps.Hour = date.Hour;
    
            return calendar.DateFromComponents(comps);
        }
    

    【讨论】:

      【解决方案4】:
      public NSDate ConvertDateTimeToNSDate(DateTime date)
      {
          DateTime newDate = TimeZone.CurrentTimeZone.ToLocalTime(
              new DateTime(2001, 1, 1, 0, 0, 0) );
          return NSDate.FromTimeIntervalSinceReferenceDate(
              (date - newDate).TotalSeconds);
      }
      
      public DateTime ConvertNsDateToDateTime(NSDate date)
      {
          DateTime newDate = TimeZone.CurrentTimeZone.ToLocalTime( 
              new DateTime(2001, 1, 1, 0, 0, 0) );
          return newDate.AddSeconds(date.SecondsSinceReferenceDate);
      }
      

      来源:https://theweeklybyte.wordpress.com/2014/05/27/convert-datetime-to-nsdate-and-back/

      【讨论】:

        【解决方案5】:

        你想看看NSDateFormatter类:)

        您的代码将如下所示。 . .

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"MMM dd, yyyy HH:mm"];
        
        NSDate *parsed = [formatter dateFromString:dateString];
        

        S

        PS 示例大量复制自this question :)

        【讨论】:

        • 我将研究使用 NSDateFormatter 设置日期。 Monotouch 没有 Objective C 的所有方法,但它看起来是朝着正确方向迈出的一步。谢谢院长
        • 我自己从未使用过 monotouch,但显然 NSDateFormatter 在 1.4.4 版中可用 (monotouch.net/index.php?title=Releases/…)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 2012-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        相关资源
        最近更新 更多