web-dev-qa-db-ja.com

Swiftミリ秒としてのiOSの日付DoubleまたはUInt64?

私はiOS開発者ではありませんが、Swiftを学び始めました。

ロジックをAndroidプロジェクトからiOSに変換しようとしています

私は次の方法があります:

_func addGroupItemSample(sample : WmGroupItemSample){ // some custom class

    var seconds: NSTimeInterval = NSDate().timeIntervalSince1970
    var  cuttDate:Double =  seconds*1000;

    var sampleDate: UInt64 = sample.getStartDate(); // <-- problematic place

if(sampleDate > cuttDate){
   // ....
  }
}
_

上記のメソッドから、sample.getStartDate()がタイプ_UInt64_を返すことがわかります。

私はそれをJavaのlongのように思いました:System.currentTimeMillis()

ただし、ミリ秒単位の現在の時刻はDoubleとして定義されています。

Doubleと_UInt64_を混在させるのは適切な方法ですか、それともすべてのミリ秒をDoubleのみとして表す必要がありますか?

おかげで、

16
snaggs

Swiftでは、異なるタイプを比較することはできません。

secondsは、秒単位の精度の秒単位のDouble浮動小数点値です。
sampleDateはUInt64ですが、単位は指定されていません。 sampleDateは、秒単位のDouble浮動小数点値に変換する必要があります。

var sampleDate: Double = Double(sample.getStartDate())

次に、それらを比較できます。

if(sampleDate > cuttDate){}
5
zaph

iOSではdoubleを使用する方が良いですが、コードを簡単に移植して一貫性を保ちたい場合は、これを試すことができます。

func currentTimeMillis() -> Int64{
    let nowDouble = NSDate().timeIntervalSince1970
    return Int64(nowDouble*1000)
}
28
Ben

Swift 3の代替バージョンです:

   /// Method to get Unix-style time (Java variant), i.e., time since 1970 in milliseconds. This 
   /// copied from here: http://stackoverflow.com/a/24655601/253938 and here:
   /// http://stackoverflow.com/a/7885923/253938
   /// (This should give good performance according to this: 
   ///  http://stackoverflow.com/a/12020300/253938 )
   ///
   /// Note that it is possible that multiple calls to this method and computing the difference may 
   /// occasionally give problematic results, like an apparently negative interval or a major jump 
   /// forward in time. This is because system time occasionally gets updated due to synchronization 
   /// with a time source on the network (maybe "leap second"), or user setting the clock.
   public static func currentTimeMillis() -> Int64 {
      var darwinTime : timeval = timeval(tv_sec: 0, tv_usec: 0)
      gettimeofday(&darwinTime, nil)
      return (Int64(darwinTime.tv_sec) * 1000) + Int64(darwinTime.tv_usec / 1000)
   }
4
RenniePet
func get_microtime() -> Int64{
    let nowDouble = NSDate().timeIntervalSince1970
    return Int64(nowDouble*1000)
}

正常に動作しています

1
Softlabsindia