Bagaimana cara mengubah NSDate menjadi unix timestamp iphone SDK?

143

Bagaimana cara mengubah NSDatecap waktu menjadi Unix? Saya telah membaca banyak posting yang melakukan kebalikannya. Tetapi saya tidak menemukan sesuatu yang berhubungan dengan pertanyaan saya.

neha
sumber

Jawaban:

269

Saya percaya ini adalah pemilih NSDate yang Anda cari:

- (NSTimeInterval)timeIntervalSince1970
BAndonovski
sumber
2
Apakah ini mengembalikan cap waktu unix jika disediakan dengan nsdate?
neha
1
Ya, inilah tepatnya yang Anda cari. UNIX mengukur waktu dalam detik sejak 1 Januari 1970, dan metode ini mengembalikan interval antara penerima (NSDate yang Anda berikan) dan instan pertama 1 Januari 1970, GMT. NSTimeInterval sebenarnya merupakan typedef ganda.
BAndonovski
26
Untuk mendapatkan string (28/11/2011 14:14:13 <-> 1322486053): [NSString stringWithFormat: @ "%. 0f", [aDate timeIntervalSince1970]];;
ıɾuǝʞ
2
Metode ini diubah oleh waktu yang ditetapkan pada perangkat secara umum. Saya melakukan tes di mana saya mendapat cap waktu pada jam 12 malam kemudian berubah sekitar waktu di iPad menjadi sekitar jam 8 malam dan perbedaan dalam dua angka itu sangat tinggi. Jika cap waktu tidak tergantung pada perangkat, angkanya semestinya dimatikan hanya dalam hitungan detik, tetapi dalam hal ini saya harus menyimpulkan bahwa waktu di iPad benar-benar memengaruhi unixTimeStamp
Esko918
1
@ Esko918 Yah tentu saja. Waktu Unix menggambarkan jumlah detik dari tahun 1970 hingga saat Anda ingin menentukan ("sekarang" dalam kasus ini). Jika Anda mengubah waktu di iPad Anda, Anda secara efektif mengubah "sekarang" ke waktu lain dan karenanya perbedaan dalam prangko waktu.
marsbear
69

Sebuah Unix timestamp adalah jumlah detik sejak 00:00:00 UTC 1 Januari 1970. Ini diwakili oleh jenis time_t , yang biasanya ditandatangani 32-bit tipe integer (panjang atau int).

iOS menyediakan - (NSTimeInterval) timeIntervalSince1970 untuk objek NSDate yang mengembalikan jumlah detik sejak 00:00:00 GMT 1 Januari 1970. NSTimeInterval adalah tipe titik mengambang ganda sehingga Anda mendapatkan detik dan fraksi per detik.

Karena keduanya memiliki referensi yang sama (tengah malam 1Jan1970 UTC) dan keduanya mudah dalam konversi, konversikan NSTimeInterval menjadi time_t, pembulatan atau pemotongan tergantung pada kebutuhan Anda:

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
program
sumber
Fungsi ini menunjukkan kepada saya tanggal yang benar tetapi waktunya salah. Itu tidak cocok dengan waktu sistem.
neha
Waktu Unix adalah UTC (GMT), India UTC + 5,5. Apakah mati 5,5 jam?
program
7
Waktu sistem Anda menunjukkan waktu di zona waktu lokal Anda, yang baik-baik saja. Stempel waktu Unix bukan waktu setempat, selalu waktu UTC, berbeda dengan +5: 30 di India, -7: 00 dari sini. Itu benar.
program
Tapi bagaimana cara menggunakannya? Bisakah saya menggunakannya dalam perhitungan saya nanti? Saya memiliki satu cap waktu UNIX dari database PHP online dan kemudian yang ini. Saya ingin membandingkan keduanya untuk membuat keputusan untuk mengunduh data terbaru tentang suatu objek.
JeroenEijkhof
Saya hanya melakukan ini sekarang: di int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) mana piece.piece.last_view adalah NSDate
JeroenEijkhof
26

Anda dapat membuat tanggal cap waktu unix dari tanggal dengan cara ini:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
Peter Van de Put
sumber
21
Ini salah, timeIntervalSince1970 mengembalikan TimeInterval yang sebenarnya merupakan dobel.
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;
    }

CATATAN: - Stempel waktu harus dalam Zona UTC, Jadi saya mengonversi Waktu lokal kami ke Waktu UTC.

Vicky
sumber
6

Cepat

Diperbarui untuk Swift 3

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

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

Catatan

  • timeIntervalSince1970mengembalikan TimeInterval, yang merupakan typealias untuk Double.

  • Jika Anda ingin pergi ke arah lain, Anda bisa melakukan yang berikut:

      let myDate = Date(timeIntervalSince1970: myTimeStamp)
Suragch
sumber
5

Jika Anda ingin menyimpan waktu ini dalam database atau mengirimkannya ke server ... yang terbaik adalah menggunakan cap waktu Unix. Berikut cuplikan kecil untuk mendapatkannya:

+ (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];  
}
aahsanali
sumber
Mengapa Anda mengatur jam dan menit ke 0 dalam komponen? Juga, bagaimana hal itu akan memberi Anda UTC yang tepat berdasarkan ini [[NSTimeZone systemTimeZone] secondsFromGMT]]:? Tolong jelaskan sedikit.
Hemang
Hai teman, itu membantu saya
Rahul K Rajan
5

Cara pilihan saya adalah:

NSDate.date.timeIntervalSince1970;
Alex
sumber
4

Sesuai saran @ kexik menggunakan fungsi waktu UNIX seperti di bawah ini:

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

Sesuai pengalaman saya - jangan gunakan timeIntervalSince1970, itu memberikan cap waktu zaman - jumlah detik Anda berada di belakang GMT.

Dulu ada bug dengan [[tanggal NSDate] timeIntervalSince1970], itu digunakan untuk menambah / mengurangi waktu berdasarkan zona waktu telepon tetapi tampaknya sudah diatasi sekarang.

Tapan Thaker
sumber
Saya mengoreksi jawaban saya - sepertinya benar-benar sama. Meskipun waktu (NULL) mungkin sedikit lebih cepat karena tidak memanggil runtime obj-c. : P Kode uji NSLog (@ "time (NULL) =% d; timeIntervalSince1970 =% d", (int) waktu (NULL), (int) [[NSDate date] timeIntervalSince1970]);
k3a
Saya menghadapi masalah dengan [[NSDate date] timeIntervalSince1970]. Mereka tampaknya mempertimbangkan wilayah Anda juga.
Tapan Thaker
Ya, inilah yang saya pikir saya alami hari itu tetapi pada iOS7 Simulator dan perangkat iOS6 dengan GMT + 2 zona waktu mereka sekarang tampak sama ... Lagi pula, waktu (NULL) selalu bekerja :)
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]]; 

unixtime pertama 1532278070

unixtime kedua 1532278070.461380

unixtime ketiga 1532278070

pengguna1105951
sumber
0

Jika Anda membutuhkan cap waktu sebagai string.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
nanjunda
sumber