NSDateをUNIXタイムスタンプiPhone iPhone SDKに変換する方法は?


143

NSDateをUnixタイムスタンプに変換する方法は?私はその逆を行う多くの投稿を読みました。しかし、私の質問に関連するものは何も見つかりません。

回答:


269

これはあなたが探しているNSDateのセレクターだと思います:

- (NSTimeInterval)timeIntervalSince1970

2
nsdateが指定されている場合、これはUNIXタイムスタンプを返しますか?
ネハ

1
はい、これはまさにあなたが探しているものです。UNIXは1970年1月1日からの時間を秒単位で測定し、このメソッドはレシーバー(ユーザーが提供するNSDate)と1970年1月1日の最初の瞬間(GMT)との間の間隔を返します。NSTimeIntervalは、実際にはdoubleのtypedefです。
BAndonovski

26
文字列を取得するには(2011/11/28 14:14:13 <-> 1322486053):[NSString stringWithFormat:@ "%。0f"、[aDate timeIntervalSince1970]];
ıɾuǝʞ

2
方法は、一般的にデバイスで設定された時間によって変更されます。私は、午後12時にタイムスタンプを取得し、その後iPadで午後8時頃に変更して、2つの数値の差が非常に大きいというテストを行いました。タイムスタンプがデバイスの時間に依存しない場合、数値はほんの数秒ずれているはずですが、この場合、iPadの時間がunixTimeStamp
Esko918

1
@ Esko918もちろんです。Unix時間は、1970年から指定したい時点(この場合は「現在」)までの秒数を表します。iPadで時刻を変更すると、「今」が別の時刻に変更され、タイムスタンプの違いが生じます。
marsbear 2016年

69

A Unixタイムスタンプは、これは、型によって表されます00:00:00 1970年1月1日からの秒数でのtime_t通常の符号付き32ビット整数型(longまたはINT)です。

iOSは、NSDateオブジェクトに-(NSTimeInterval)timeIntervalSince1970を提供しており、1970年1月1日00:00:00 GMT以降の秒数を返します。NSTimeIntervalは、倍精度浮動小数点型なので、秒と秒の小数部を取得できます。

どちらも同じ参照(真夜中1Jan1970 UTC)であり、どちらも秒単位で簡単に変換できるため、NSTimeIntervalをtime_tに変換し、必要に応じて丸めたり切り捨てたりします。

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];

この関数は正しい日付を表示しますが、時刻が間違っています。システム時刻と一致しません。
ネハ

Unix時間はUTC(GMT)、インドはUTC + 5.5です。5.5時間ずれていますか?
progrmr

7
システム時刻は、ローカルタイムゾーンで時刻を表示していますが、これは問題ありません。Unixタイムスタンプは現地時間ではなく、常にUTC時間です。インドでは+5:30、ここから-7:00異なります。そのとおりです。
progrmr

しかし、それをどのように使用しますか?後で計算に使用できますか?オンラインのPHPデータベースから1つのUNIXタイムスタンプを取得し、次にこれを取得します。オブジェクトに関する最新のデータをダウンロードすることを決定するために、2つを比較したいと思います。
JeroenEijkhof、

私は今これをやっています:int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) piece.piece.last_viewはNSDateです
JeroenEijkhof

26

次の方法で、日付からUNIXタイムスタンプ日付を作成できます。

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];

21
これは間違っています。timeIntervalSince1970は、実際にはdoubleであるTimeIntervalを返します。
Matt Wolfe

9
- (void)GetCurrentTimeStamp
    {
        NSDateFormatter *objDateformat = [[NSDateFormatter alloc] init];
        [objDateformat setDateFormat:@"yyyy-MM-dd"];
        NSString    *strTime = [objDateformat stringFromDate:[NSDate date]];
        NSString    *strUTCTime = [self GetUTCDateTimeFromLocalTime:strTime];//You can pass your date but be carefull about your date format of NSDateFormatter.
        NSDate *objUTCDate  = [objDateformat dateFromString:strUTCTime];
        long long milliseconds = (long long)([objUTCDate timeIntervalSince1970] * 1000.0);

        NSString *strTimeStamp = [Nsstring stringwithformat:@"%lld",milliseconds];
        NSLog(@"The Timestamp is = %@",strTimestamp);
    }

 - (NSString *) GetUTCDateTimeFromLocalTime:(NSString *)IN_strLocalTime
    {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd"];
        NSDate  *objDate    = [dateFormatter dateFromString:IN_strLocalTime];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        NSString *strDateTime   = [dateFormatter stringFromDate:objDate];
        return strDateTime;
    }

注:-タイムスタンプはUTCゾーンにある必要があるため、ローカル時間をUTC時間に変換します。


6

迅速

Swift 3用に更新

// current date and time
let someDate = Date()

// time interval since 1970
let myTimeStamp = someDate.timeIntervalSince1970

ノート

  • timeIntervalSince1970TimeIntervalは、のタイプエイリアスであるを返しますDouble

  • 別の方法で移動したい場合は、次の操作を実行できます。

      let myDate = Date(timeIntervalSince1970: myTimeStamp)

5

これらの時間をデータベースに保存したり、サーバーに送信したりする場合は、Unixタイムスタンプを使用するのが最適です。これを取得するための小さなスニペットを次に示します。

+ (NSTimeInterval)getUTCFormateDate{

    NSDateComponents *comps = [[NSCalendar currentCalendar] 
                               components:NSDayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit 
                               fromDate:[NSDate date]];
    [comps setHour:0];
    [comps setMinute:0];    
    [comps setSecond:[[NSTimeZone systemTimeZone] secondsFromGMT]];

    return [[[NSCalendar currentCalendar] dateFromComponents:comps] timeIntervalSince1970];  
}

コンポーネントで時間と分を0に設定しているのはなぜですか?また、これに基づいて正確なUTCがどのように提供される[[NSTimeZone systemTimeZone] secondsFromGMT]]か: ?少し説明してください。
Hemang 2015

こんにちは友人それは私を助けました
Rahul K Rajan 2017年


4

@kexikの提案に従って、以下のUNIX時間関数を使用します。

  time_t result = time(NULL);
  NSLog([NSString stringWithFormat:@"The current Unix epoch time is %d",(int)result]);

。私の経験によると-timeIntervalSince1970を使用しないでください。エポックタイムスタンプ-GMTより遅れている秒数を提供します。

[[NSDate date] timeIntervalSince1970]には以前からバグがあり、電話のタイムゾーンに基づいて時間を加算または減算していたが、現在は解決されているようだ。


私は私の答えを修正しています-それは本当に等しいようです。time(NULL)はobj-cランタイムを呼び出さないため、少し高速になる可能性があります。:PテストコードNSLog(@ "time(NULL)=%d; timeIntervalSince1970 =%d"、(int)time(NULL)、(int)[[NSDate date] timeIntervalSince1970]);
k3a 2014年

[[NSDate date] timeIntervalSince1970]で問題に直面しました。彼らもあなたがいる地域を考慮しているようです。
Tapan Thaker 2014年

はい、これは私がその日に経験したものだと思いますが、GMT + 2タイムゾーンのiOS7シミュレータとiOS6デバイスでは、それらは同じように見えます...とにかく、time(NULL)は常に機能します:)
k3a

2
 [NSString stringWithFormat: @"first unixtime is %ld",message,(long)[[NSDate date] timeIntervalSince1970]];

 [NSString stringWithFormat: @"second unixtime is %ld",message,[[NSDate date] timeIntervalSince1970]];

 [NSString stringWithFormat: @"third unixtime is %.0f",message,[[NSDate date] timeIntervalSince1970]]; 

最初のUNIX時間1532278070

2番目のunixtime 1532278070.461380

3番目のUNIX時間1532278070


0

文字列としてタイムスタンプが必要な場合。

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.