23932


現在時刻については

[code]

    UInt64(NSDate().timeIntervalSince1970)
    
[/code]

でとれることを確認できたのですが、現在時刻より１００ミリ秒前や１００ミリ秒後といった  
値の取り方はNSDate()で可能なのでしょうか。


CC BY-SA 3.0
2016-04-11T17:23:19.750
23926
2016-04-12T02:15:51.347
12842
question
swift
現在時刻から　ms後、ms前の値を求めたい


`NSDate()`は現在時刻を表す`NSDate`型のインスタンスを返します。  
[`-
init`](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/occ/instm/NSDate/init)  
従って、`NSDate().timeIntervalSince1970`は、UTC(世界協定時)で1970年1月1日00:00:00から現在までの経過秒数を`NSTimeInterval`型(Swiftでは`Double`のtypealias)で表したものということになります。これには秒単位以下の情報が小数部に含まれます。  
[timeIntervalSince1970](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/#//apple_ref/occ/instp/NSDate/timeIntervalSince1970)

(`NSDate`型は内部表現として、`timeIntervalSinceReferenceDate`で返ってくる方の値を使用しているのですが、話がややこしくなるので詳細は触れません。)

せっかく`Double`で保持している値を`UInt64`型に変換してしまうと、秒以下の情報が失われてしまうので、100ミリ秒前、100ミリ秒後といった具合にミリ秒単位での時間計算には使えなくなってしまいます。

アプリの中では一貫して「時刻」を`NSTimeInterval`型で「UTCの1970-01-01
00:00:00からの秒数」として扱う、と言うことにするのであれば、

[code]

    let nowEpoch = NSDate().timeIntervalSince1970 //->現在時刻
    let epochAfter100ms = NSDate().timeIntervalSince1970 + 0.1 //->現在時刻より100ms(=0.1s)後
    let epochBefore100ms = NSDate().timeIntervalSince1970 - 0.1 //->現在時刻より100ms(=0.1s)前
    
[/code]

もちろん2番目と3番目は`nowEpoch`を使って、

[code]

    let epochAfter100ms = nowEpoch + 0.1 //->現在時刻より100ms(=0.1s)後
    let epochBefore100ms = nowEpoch - 0.1 //->現在時刻より100ms(=0.1s)前
    
[/code]

と書いても構いません。

* * *

アプリの中では一貫して「時刻」を`NSDate`として扱う、と言うことにするのであれば、

[code]

    let after100ms = NSDate(timeIntervalSinceNow: 0.1) //->現在時刻より100ms(=0.1s)後
    let before100ms = NSDate(timeIntervalSinceNow: -0.1) //->現在時刻より100ms(=0.1s)前
    
[/code]

と言った形で、現在時刻より前／後の時刻を直接`NSDate`型で取得することもできます。

* * *

一部のプラットフォームでは時刻を経過秒数部分と秒以下の部分に分けて取得する場合がありますので、その場合の「経過秒数部分」と互換な値を取得するコードとして`UInt64(NSDate().timeIntervalSince1970)`というコードを見つけられたのだと思いますが、Swift(というよりも`NSDate`型)では、秒以下の情報も`timeIntervalSince1970`に含まれていますので、「ミリ秒」単位(場合によってはマイクロ秒単位)で時刻を扱いたい場合に一旦秒以下を切り捨てる必要はないでしょう。


CC BY-SA 3.0
2016-04-12T02:15:51.347
23932
2016-04-12T02:15:51.347
13972
23926
answer