Нужно показывать время в секундах без изменения времени, пока мы меняем часовой пояс
В настоящее время я работаю над заявкой на участие в торгах, приложение для ставок работает в основном на основе времени, которое я использовал для расчета времени с помощью
NSLog(@"date %d",(int)[[NSDate date] timeIntervalSince1970]);
output:1409031539
Я взял серверное время и сравнил время устройства и вычислил, но при изменении часового пояса это не рабочее время меняется, для этого я использовал этот код.
NSLocale* currentLocale = [NSLocale currentLocale];
NSLog(@"date: %d",(int)[[NSDate date] descriptionWithLocale:currentLocale]);
Выход:196208512
Но это не помогает мне рассчитать время, когда я запускаю код, я вижу другой вывод.
1 ответ
Эта строка:
NSLog(@"date: %d",(int)[[NSDate date] descriptionWithLocale:currentLocale]);
это так неправильно, что болит голова Возвращенные данные из descriptionWithLocale
является NSString *
не NSTimeInterval
, печатая его как int
просто конвертировать указатель на int
Это плохая идея в лучшие времена.
Я предполагаю, что ваш сервер возвращает метку времени, равную #seconds после 1970 года, поэтому я просто жестко запрограммировал пример этого в этом фрагменте кода:
NSLocale* currentLocale = [NSLocale currentLocale];
NSTimeInterval nsti = [[NSDate date] timeIntervalSince1970];
NSLog(@"date (as seconds from 1970): %ld", (long)nsti);
NSLog(@"date (as locale-relative string): %@", [[NSDate dateWithTimeIntervalSince1970:nsti] descriptionWithLocale:currentLocale]);
// This is Mon 25 Aug 2014, 20:17:51 BST (UTC +0100) obtained by date +%s, subtracting 60,000
NSTimeInterval time_from_server = 1408994271;
NSLog(@"date (from server as string): %@", [[NSDate dateWithTimeIntervalSince1970:time_from_server] descriptionWithLocale:currentLocale]);
Обратите внимание, однако, что ни NSDate
или NSTimeInterval
Я не имею понятия о часовом поясе и, следовательно, не имею понятия о смещении от GMT. Что вам нужно для этого NSTimeZone
, Учитывая, что смещение от GMT
В зависимости от текущей даты / времени (например, летнее время, зимнее время), вы должны использовать код, подобный следующему:
NSTimeZone *localZone = [NSTimeZone localTimeZone];
NSDate *date111 = [NSDate date];
NSInteger delta = [localZone secondsFromGMTForDate:date111];
NSLog(@"date= %ld", (long)delta);
Получить часовой пояс, получить дату, получить смещение от GMT для даты, зарегистрируйте его.
Отображение времени как местного часового пояса:
NSTimeZone *phoenix = [NSTimeZone timeZoneWithName:@"America/Phoenix"];
NSTimeZone *dublin = [NSTimeZone timeZoneWithName:@"Europe/Dublin"];
NSTimeZone *tokyo = [NSTimeZone timeZoneWithName:@"Asia/Tokyo"];
NSDate *date111 = [NSDate date];
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
[fmt setDateStyle:NSDateFormatterFullStyle];
[fmt setTimeStyle:NSDateFormatterFullStyle];
[fmt setLocale:[NSLocale currentLocale]];
[fmt setTimeZone:phoenix];
NSLog(@"phoenix %@", [fmt stringFromDate:date111]);
[fmt setTimeZone:dublin];
NSLog(@"dublin %@", [fmt stringFromDate:date111]);
[fmt setTimeZone:tokyo];
NSLog(@"tokyo %@", [fmt stringFromDate:date111]);
Дает мне (на данный момент):
phoenix Tuesday, August 26, 2014 at 9:33:12 AM Mountain Standard Time
dublin Tuesday, August 26, 2014 at 5:33:12 PM Irish Summer Time
tokyo Wednesday, August 27, 2014 at 1:33:12 AM Japan Standard Time
Основные понятия здесь:
- NSDate не имеет понятия часового пояса
- NSTimeInterval не имеет понятия часового пояса
- Часовой пояс нужен только для форматирования времени для отображения
Поэтому, имея это в виду, когда вы получаете время устройства, это просто NSDate или NSTimeInterval, что означает, что он не кодирует часовой пояс в него.