简体   繁体   English

Swift:将NSDate转换为C#刻度

[英]Swift: convert NSDate to c# ticks

i need to convert a NSDate to C# ticks. 我需要将NSDate转换为C#刻度。

DateTime.ticks converts date to ticks starting from January 1 0001. DateTime.ticks将日期转换为从0001年1月1日开始的刻度。

How can i do that? 我怎样才能做到这一点? Thanks in advance. 提前致谢。

I borrowed this code somewhere, so I'm not an author. 我在某处借用了此代码,所以我不是作者。 Here it goes: 它去了:

   @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

The OP tagged his question with Swift, so here's an alternative answer, although it is basically the same as Nikolay has posted. OP用Swift标记了他的问题,所以这是一个替代答案,尽管它与Nikolay发布的基本上相同。 However, this version adds support for mapping DateTime.MinValue and DateTime.MaxValue to/from Date.distantPast and Date.distantFuture. 但是,此版本增加了将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
       }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM