Как конвертировать NSDate в метку времени Unix iphone SDK? - PullRequest
141 голосов
/ 08 июня 2010

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

Ответы [ 10 ]

266 голосов
/ 08 июня 2010

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

- (NSTimeInterval)timeIntervalSince1970
69 голосов
/ 08 июня 2010

A Unix timestamp - это количество секунд с 00:00:00 UTC 1 января 1970 года. Оно представлено типом time_t , который обычно является 32-разрядным со знаком целочисленный тип (long или int).

iOS предоставляет - (NSTimeInterval) timeIntervalSince1970 для объектов NSDate, который возвращает количество секунд с 00:00:00 по Гринвичу 1 января 1970 года. NSTimeInterval - это двойной тип с плавающей запятой, поэтому вы получаете секунды и доли секунды.

Так как они оба имеют одинаковую ссылку (полночь 1Jan1970 UTC) и обе в секундах, преобразование легко, конвертируйте NSTimeInterval в time_t, округляя или обрезая в зависимости от ваших потребностей:

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
26 голосов
/ 21 декабря 2012

Вы можете создать дату отметки времени Unix из даты следующим образом:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
9 голосов
/ 14 июля 2014
- (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 голосов
/ 08 июня 2016

Swift

Обновлено для 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 голосов
/ 10 марта 2014

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

NSDate.date.timeIntervalSince1970;
5 голосов
/ 21 октября 2011

Если вы хотите сохранить это время в базе данных или отправить его через сервер ... лучше всего использовать метки времени 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];  
}
4 голосов
/ 28 марта 2014

Согласно совету @ kexik с использованием функции времени UNIX, как показано ниже:

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

. Согласно моему опыту - не используйте timeIntervalSince1970, он дает метку времени эпохи - количество секунд, в течение которых вы находитесьза временем по Гринвичу.

Раньше была ошибка с [[NSDate date] timeIntervalSince1970], раньше она добавляла / вычитала время в зависимости от часового пояса телефона, но, похоже, сейчас исправлена.

1 голос
/ 22 июля 2018
 [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 голосов
/ 05 декабря 2016

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

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