Как конвертировать NSDate в метку времени Unix iphone SDK?


143

Как конвертировать NSDateв метку времени Unix? Я прочитал много постов, которые делают обратное. Но я не нахожу ничего связанного с моим вопросом.

Ответы:


269

Я считаю, что это селектор NSDate, который вы ищете:

- (NSTimeInterval)timeIntervalSince1970

2
Возвращает ли это метку времени Unix, если она указана в nsdate?
неха

1
Да, это именно то, что вы ищете. UNIX измеряет время в секундах с 1 января 1970 года, и этот метод возвращает интервал между получателем (указанная вами NSDate) и первым моментом 1 января 1970 года по Гринвичу. NSTimeInterval на самом деле является typedef типа double.
Бандоновски

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 по Гринвичу 1 января 1970 года. 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. Это правильно.
прогрмр

Но тогда как это использовать? Могу ли я использовать это в моих расчетах позже? У меня есть одна отметка времени 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, что является typealias для 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

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

5

Мой предпочтительный способ просто:

NSDate.date.timeIntervalSince1970;

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 runtime. : P Тестовый код NSLog (@ "time (NULL) =% d; timeIntervalSince1970 =% d", (int) time (NULL), (int) [[NSDate date] timeIntervalSince1970]);
k3a

У меня возникли проблемы с [[NSDate date] timeIntervalSince1970]. Похоже, они рассматривают регион, в котором вы находитесь.
Тапан Такер

Да, это то, что я испытал в тот день, но на 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]]; 

первый unixtime 1532278070

второй unixtime 1532278070.461380

третий unixtime 1532278070


0

Если вам нужна отметка времени в виде строки.

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