Как преобразовать NSDate в метку времени Unix для iPhone SDK для?
Как преобразовать NSDate
в Unix timestamp? Я читал много сообщений, которые делают обратное. Но я не нашел ничего связанного с моим вопросом.
10 ответов:
A Unix timestamp - это количество секунд с 00:00: 00 UTC 1 января 1970 года. Он представлен типом time_t, который обычно является 32-разрядным целочисленным типом со знаком (long или int).
iOS предоставляет - (NSTimeInterval)timeIntervalSince1970 для объектов NSDate, который возвращает количество секунд с 00: 00: 00 GMT 1 января 1970 года. NSTimeInterval-это двойной тип с плавающей запятой, поэтому вы получаете секунды и доли a второй.
поскольку они оба имеют одинаковую ссылку (midnight 1Jan1970 UTC) и оба в секундах преобразование легко, преобразуйте NSTimeInterval в time_t, округляя или усекая в зависимости от ваших потребностей:
time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
вы можете создать дату метки времени unix от даты таким образом:
int timestamp = [[NSDate date] timeIntervalSince1970];
- (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.
Свифт
обновлено для 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)
Если вы хотите хранить данные в базе данных или отправить его через сервер...лучше всего использовать временные метки 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]; }
согласно предложению @kexik, используя функцию времени UNIX, как показано ниже:
time_t result = time(NULL); NSLog([NSString stringWithFormat:@"The current Unix epoch time is %d",(int)result]);
.согласно моему опыту-не используйте timeIntervalSince1970, он дает временную метку эпохи - количество секунд, которое вы отстаете от GMT.раньше была ошибка с [[nsdate date]timeIntervalSince1970], она использовалась для добавления/вычитания времени на основе часового пояса телефона, но теперь она, похоже, решена.
[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