Nasıl NSDate unix zaman damgası iphone sdk dönüştürmek için?


143

Nasıl bir NSDateUnix zaman damgası dönüştürmek için ? Bunun tersini yapan birçok yazı okudum. Ama sorumla ilgili hiçbir şey bulamıyorum.

Yanıtlar:


269

Bu, aradığınız NSDate'in seçici olduğuna inanıyorum:

- (NSTimeInterval)timeIntervalSince1970

2
Eğer bir nsdate ile donatılmışsa bu unix zaman damgası döndürüyor mu?
neha

1
Evet, tam olarak aradığınız şey bu. UNIX, 1 Ocak 1970'ten bu yana saniye cinsinden zamanı ölçer ve bu yöntem, alıcı (sağladığınız NSDate) ile 1 Ocak 1970 GMT'nin ilk anı arasındaki aralığı döndürür. NSTimeInterval aslında bir double tanımlamasıdır.
BAndonovski

26
Bir dize almak için (28/11/2011 14:14:13 <-> 1322486053): [NSString stringWithFormat: @ "%. 0f", [aDate timeIntervalSince1970]];
ıɾuǝʞ

2
Yöntem, genel olarak cihazda ayarlanan zamana göre değiştirilir. Ben 12 de zaman damgası var bir test yaptım sonra iPad zaman yaklaşık 8 pm değişti ve iki sayı farkı son derece yüksekti. Zaman damgası cihaz zamanına bağlı değilse, sayılar sadece saniyeler tarafından kapatılmış olmalıdır, ancak bu durumda iPad'deki zamanın 19
58'de

1
@ Esko918 Elbette. Unix zamanı, 1970'den belirtmek istediğiniz zamana kadar geçen saniye sayısını tanımlar (bu durumda "şimdi"). İPad'inizdeki saati değiştirirseniz, "şimdi" yi başka bir zamana ve dolayısıyla zaman damgalarındaki farkı etkili bir şekilde değiştirirsiniz.
marsbear

69

Bir Unix zaman damgasını 1 Ocak 1970. 00:00:00 UTC beri saniye sayısıdır Bu tip ile temsil ediyor time_t bir işaretli 32 bit tamsayı tipi (uzun ya da int) olup.

iOS sağlar - (NSTimeInterval) timeIntervalSince1970 1 Ocak 1970 00:00:00 GMT'den beri saniye sayısını döndüren NSDate nesneleri için . NSTimeInterval, saniyenin saniye ve kesirlerini elde etmek için çift kayan nokta türüdür.

Her ikisi de aynı referansa (gece yarısı 1 Ocak 1970 UTC) sahip olduğundan ve her ikisi de saniyeler içinde dönüşüm kolay olduğundan, NSTimeInterval'ı ihtiyaçlarınıza göre bir time_t, yuvarlama veya kesme işlemine dönüştürün:

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

Bu işlev bana doğru tarihi gösteriyor ancak saat yanlış. Sistem zamanı ile eşleşmiyor.
neha

Unix süresi UTC (GMT), Hindistan UTC + 5.5'tir. 5.5 saat mi kaldı?
progrmr

7
Sistem saatiniz yerel saat diliminizde zamanı gösteriyor, bu da iyi. Unix zaman damgası yerel saat değildir, her zaman UTC saatidir, Hindistan'da +5: 30, buradan -7: 00 farklılık gösterir. Bu doğru.
progrmr

Ama sonra nasıl kullanılır? Daha sonra hesaplamalarda kullanabilir miyim? Çevrimiçi bir PHP veritabanından bir UNIX zaman damgası var ve daha sonra bu. Bir nesne hakkında en son verileri indirmeye karar vermek için ikisini karşılaştırmak istiyorum.
JeroenEijkhof

Bunu şimdi yapıyorum: int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) burada piece.piece.last_view bir NSDate
JeroenEijkhof

26

Bir tarihten bir unix zaman damgası tarihi şu şekilde oluşturabilirsiniz:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];

21
Bu yanlış, timeIntervalSince1970 aslında bir çift olan bir TimeInterval döndürür.
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;
    }

NOT: - Zaman Damgası UTC Bölgesinde olmalıdır, bu yüzden yerel Saatimizi UTC Saatine dönüştürüyorum.


6

hızlı

Swift 3 için güncellendi

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

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

notlar

  • timeIntervalSince1970TimeIntervaliçin bir typealias olan döner Double.

  • Başka bir yoldan gitmek istiyorsan aşağıdakileri yapabilirsin:

      let myDate = Date(timeIntervalSince1970: myTimeStamp)

5

Bu zamanı bir veritabanında saklamak veya sunucu üzerinden göndermek istiyorsanız ... en iyisi Unix zaman damgalarını kullanmaktır. İşte bunu elde etmek için küçük bir pasaj:

+ (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];  
}

Bileşenlerde neden saati ve dakikayı 0 olarak ayarlıyorsunuz? Ayrıca, nasıl oluyor da bu dayalı UTC kesin vereceğiz: [[NSTimeZone systemTimeZone] secondsFromGMT]]? Lütfen biraz açıklayınız.
Hemang

Merhaba arkadaşım bana yardımcı oldu
Rahul K Rajan

5

Tercih ettiğim yol:

NSDate.date.timeIntervalSince1970;

4

UNIX zaman işlevini kullanarak @ kexik'in önerisine göre aşağıdaki gibi:

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

Deneyimlerime göre - timeIntervalSince1970 kullanmayın, dönem zaman damgası verir - GMT'nin arkasında olduğunuz saniye sayısı.

Eskiden [[NSDate date] timeIntervalSince1970] ile ilgili bir hata vardı, telefonun saat dilimine göre zaman ekliyor / çıkarıyordu, ancak şimdi çözülmüş gibi görünüyor.


Cevabımı düzeltiyorum - gerçekten eşit gibi görünüyor. Her ne kadar (NULL) obj-c çalışma zamanını çağırmıyor gibi biraz daha hızlı olabilir. : P Test kodu NSLog (@ "saat (NULL) =% d; timeIntervalSince1970 =% d", (int) saat (NULL), (int) [[NSDate tarihi] timeIntervalSince1970]);
k3a

[[NSDate date] timeIntervalSince1970] ile ilgili sorunlarla karşılaştım. Bulunduğunuz bölgeyi de düşünüyorlar.
Tapan Thaker

Evet, sanırım o gün yaşadığım şey bu ama GMT + 2 saat dilimi ile iOS7 Simulator ve iOS6 cihazında şimdi eşit görünüyorlar ... Her neyse, zaman (NULL) her zaman çalışır :)
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]]; 

ilk unixtime 1532278070

ikinci unixtime 1532278070.461380

üçüncü unixtime 1532278070


0

Dize olarak zaman damgasına ihtiyacınız varsa.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.