Як конвертувати NSDate в unix timetamp iphone sdk?


143

Як конвертувати NSDateчасову позначку в Unix? Я прочитав багато постів, які роблять зворотне. Але я не знаходжу нічого, що стосується мого питання.

Відповіді:


269

Я вважаю, що це селектор NSDate, якого ви шукаєте:

- (NSTimeInterval)timeIntervalSince1970

2
Чи повертається ця часова мітка unix, якщо вона надана nsdate?
неха

1
Так, саме це ви шукаєте. UNIX вимірює час у секундах з 1 січня 1970 року, і цей метод повертає інтервал між приймачем (NSDate, який ви надаєте) та першим моментом 1 січня 1970 року GMT. NSTimeInterval - це фактично тип подвійних.
Бандоновський

26
Щоб отримати рядок (28.11.2011 14:14:13 <-> 1322486053): [NSString stringWithFormat: @ "%. 0f", [aDate timeIntervalSince1970]];
ıɾuǝʞ

2
Метод змінюється часом, встановленим на пристрої загалом. Я зробив тест, де я отримав позначку часу в 12 вечора, потім змінив протягом часу на iPad приблизно до 8 вечора, і різниця в двох числах була надзвичайно великою. Якщо позначка часу не залежала від часу пристрою, цифри повинні були бути вимкнені всього за кілька секунд, але в цьому випадку я повинен був зробити висновок, що час на iPad впливає на unixTimeStamp
Esko918

1
@ Esko918 Ну звичайно. Час Unix описує кількість секунд з 1970 року до моменту часу, який ви хочете вказати ("зараз" у цьому випадку). Якщо ви змінюєте час на своєму iPad, ви фактично змінюєте "зараз" на інший час і, отже, різниця в часових марках.
marsbear

69

А Відмітка часу Unix це число секунд , що пройшли з 00:00:00 UTC 1 січня 1970 року Це являє собою представленого типу time_t , який, як правило , підписану 32-розрядний ціле число типу (довге або ціле).

iOS забезпечує - (NSTimeInterval) timeIntervalSince1970 для об’єктів NSDate, який повертає кількість секунд з 00:00:00 GMT 1 січня 1970 року. NSTimeInterval - це тип подвійної плаваючої точки, тому ви отримуєте секунди та частки секунди.

Оскільки вони мають однакові посилання (опівночі 1 січня 1970 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

Але тоді як це використовувати? Чи можу я використати це в своїх розрахунках пізніше? У мене є одна часова мітка UNIX з бази даних PHP в Інтернеті, а потім ця. Я хочу порівняти два, щоб прийняти рішення про завантаження останніх даних про об’єкт.
JeroenEijkhof

Я зараз це роблю: int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) де piece.piece.last_view є NSDate
JeroenEijkhof

26

Ви можете створити дату часової позначки Unix з дати таким чином:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];

21
Це неправильно, timeIntervalSince1970 повертає TimeInterval, який насправді є подвійним.
Метт Вулф

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

Примітки

  • timeIntervalSince1970повернення TimeInterval, що є типологією для 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]]:? Будь ласка, поясніть мало.
Хеманг

Привіт друже, мені це допомогло
Рахул К. Раджан


4

Відповідно до пропозиції @ kexik, використовуючи функцію часу UNIX, як показано нижче:

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

.За моїм досвідом - не використовуйте timeIntervalSince1970, це дає часову позначку епохи - кількість секунд, ви відстаєте від GMT.

Раніше була помилка з [[датою NSDate] timeIntervalSince1970], вона використовувалась для додавання / віднімання часу на основі часового поясу телефону, але, здається, це вирішено зараз.


Я виправляю свою відповідь - вона справді здається рівною. Хоча час (NULL) може бути крихітним швидше, оскільки він не викликає obj-c часу виконання. : P Тестовий код NSLog (@ "час (NULL) =% d; timeIntervalSince1970 =% d", (int) час (NULL), (int) [[дата NSDate] timeIntervalSince1970]);
k3a

Я зіткнувся з проблемами з [[датою NSDate] timeIntervalSince1970]. Вони, здається, також враховують регіон, у якому ви перебуваєте.
Tapan Thaker

Так, це я думаю, що я відчував у той день, але на пристрої iOS7 Simulator та iOS6 з часовим поясом GMT + 2 вони тепер здаються рівними ... У будь-якому разі, час (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]]; 

перший одноразовий 1532278070

другий одноразовий 1532278070.461380

третій одноразовий 1532278070


0

Якщо вам потрібна мітка часу як рядок.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.