【问题标题】:How can a .NET date be converted to NSTimeInterval?如何将 .NET 日期转换为 NSTimeInterval?
【发布时间】:2011-12-05 18:23:34
【问题描述】:

我们有 .NET 代码 (C#) 写入 SQLite 数据库,然后由带有 Objective-c 的 iOS (iPhone) 应用程序读取。

SQLite 中使用的日期格式是 NSTimeInterval(使用 dateWithIntervalSince1970 表示 NSDate),因为它在 iPhone 上很有效。

如何将.NET DateTime 转换为 NSTimeInterval 以便在使用 dateWithIntervalSince1970 提取时日期正确?

注意事项: 1)我试图搜索 NSTimeInterval 的基本工作原理,但只找到这个不透明的文档: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/Reference/reference.html

2) 尽管 C# 代码是理想的我很乐意使用从 3 个整数(年/月/日)到双精度的伪代码。

【问题讨论】:

    标签: c# iphone .net ios cocoa


    【解决方案1】:

    我想你的意思是NSTimeIntervalNSTimeInterval 表示时间跨度,以秒为单位,因此它在 .NET 中的逻辑等价物是 System.TimeSpan 而不是 System.DateTime。但是,如果您将其指定为时间跨度January 1, 1970 00:00:00 GMT,这是您使用-timeIntervalSince1970 得到的,那么它和System.DateTime 之间的转换就成为可能。

    要在 System.DateTime 和 POSIX 时间戳(在这种情况下 NSTimeInterval 加上亚秒级精度)之间进行转换,您可能需要这样的东西:

    DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    DateTime dt = ...;
    double intervalSince1970 = (dt - unixEpoch).TotalSeconds;
    

    走另一条路:

    DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    double intervalSince1970 = ...;
    DateTime dt = unixEpoch + TimeSpan.FromSeconds(intervalSince1970);
    

    【讨论】:

    • 是的,我的意思是从 .NET Date 到 NSInterval,您的回答有效。我只是将它作为一个扩展方法,将 DateTime 作为输入并返回一个对 1​​970 的双引用。谢谢 -
    • public static double ToNSIntervalSince1970(this DateTime dt) { DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);双间隔Since1970 = (dt - unixEpoch).TotalSeconds;返回间隔Since1970; }
    • NSTimeInterval,不是NSInterval
    • 现在我看到盲人说:)。更新问题以引用 NSTimeInterval。谢谢乔纳森。
    【解决方案2】:

    这是我们的一个实用程序中的内容,希望对您有所帮助。

    private static double GetUnixEpoch(this DateTime dateTime)
    {
        var unixTime = dateTime.ToUniversalTime() - 
            new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    
        return unixTime.TotalSeconds;
    }
    
    var epochTime = DateTime.Now.GetUnixEpoch();
    

    如果你想获得未来的日期,它也可以工作

    未来 30 分钟

    var unixTime2 = (DateTime.Now + new TimeSpan(0, 30, 0)).GetUnixEpoch();
    

    【讨论】:

      猜你喜欢
      • 2014-10-27
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多