Swift:将NSDate转换为c#ticks

时间:2016-04-14 10:25:51

标签: c# ios xcode swift datetime

我需要将NSDate转换为C#ticks。

DateTime.ticks将日期转换为从1月1日开始的刻度。

我该怎么做? 提前致谢。

2 个答案:

答案 0 :(得分:2)

我在某处借了这个代码,所以我不是作者。在这里:

   @implementation NSDate (Ticks)

    - (long long) ticks
    {
        double tickFactor = 10000000;
        long long tickValue = (long long)floor([self timeIntervalSince1970] * tickFactor) + 621355968000000000LL;
        return tickValue;
    }

    + (NSDate*) dateWithTicks:(long long)ticks
    {
        double tickFactor = 10000000;
        double seconds = (ticks - 621355968000000000LL) / tickFactor;
        return [NSDate dateWithTimeIntervalSince1970:seconds];
    }

    @end

答案 1 :(得分:2)

OP用Swift标记了他的问题,所以这里有一个替代答案,尽管它与Nikolay发布的基本相同。但是,此版本增加了对DateTime.MinValue和DateTime.MaxValue与Date.distantPast和Date.distantFuture的映射的支持。

   private static let CTicksAt1970 : Int64 = 621_355_968_000_000_000
   private static let CTicksPerSecond : Double = 10_000_000

   private static let CTicksMinValue : Int64 = 0
   private static let CTicksMaxValue : Int64 = 3_155_378_975_999_999_999


       // Method to create a Swift Date struct to reflect the instant in time specified by a "ticks" 
       // value, as used in .Net DateTime structs.
       internal static func swiftDateFromDotNetTicks(_ dotNetTicks : Int64) -> Date {

          if dotNetTicks == CTicksMinValue {
             return Date.distantPast
          }

          if dotNetTicks == CTicksMaxValue {
             return Date.distantFuture
          }

          let dateSeconds = Double(dotNetTicks - CTicksAt1970) / CTicksPerSecond
          return Date(timeIntervalSince1970: dateSeconds)
       }


       // Method to "convert" a Swift Date struct to the corresponding "ticks" value, as used in .Net 
       // DateTime structs.
       internal static func dotNetTicksFromSwiftDate(_ swiftDate : Date) -> Int64 {

          if swiftDate == Date.distantPast {
             return CTicksMinValue
          }

          if swiftDate == Date.distantFuture {
             return CTicksMaxValue
          }

          let dateSeconds = Double(swiftDate.timeIntervalSince1970)
          let ticksSince1970 = Int64(round(dateSeconds * CTicksPerSecond))
          return CTicksAt1970 + ticksSince1970
       }