2015-08-18 7 views
1

Я получаю дату с веб-сервис который находится в UTC формат. Теперь я хочу назначить его NSDate. Ниже приводится код, который я сделалiOS - Init NSDate с stringDate без расчета часового пояса

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
//[dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"]; 

NSDate *utcDate = [dateFormatter dateFromString:@"2015-08-18T23:00:00"]; 

но просчитывает свои вычисления часового пояса по умолчанию результат 2015-08-19 3:00:00 +0000. Как я могу инициализировать NSDate с той же датой и временем. Я хочу выполнить вычисления часового пояса позже на

+0

Раскоментируйте, что часовой пояс линии и установить его в формате UTC. – Desdenova

ответ

4
let dateString = "2015-08-18T23:00:00" 
let formatter = NSDateFormatter() 
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
formatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601) 
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) 
if let dateFromString = formatter.dateFromString(dateString) { 
    print(dateFromString) // "2015-08-18 23:00:00 +0000" 
} 
+1

Спасибо, сработало – Hassy

+0

@ghazi_jaffary приветствуются –

-2

NSString * dateStr = [NSString stringWithFormat: @ "% @", [dict valueForKey: @ "utc_datetime"]];

NSString* input = dateStr; 
NSString* format = @"dd MMM yyyy - HH:mm:ss'"; 

// Set up an NSDateFormatter for UTC time zone 
NSDateFormatter* formatterUtc = [[NSDateFormatter alloc] init]; 
[formatterUtc setDateFormat:format]; 
[formatterUtc setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

// Cast the input string to NSDate 
NSDate* utcDate = [formatterUtc dateFromString:input]; 

// Set up an NSDateFormatter for the device's local time zone 
NSDateFormatter* formatterLocal = [[NSDateFormatter alloc] init]; 
[formatterLocal setDateFormat:format]; 
[formatterLocal setTimeZone:[NSTimeZone localTimeZone]]; 

// Create local NSDate with time zone difference 
NSDate* localDate = [formatterUtc dateFromString:[formatterLocal stringFromDate:utcDate]]; 
NSLog(@"utc: %@", utcDate); 
NSLog(@"local: %@", localDate); 

NSDateFormatter *format1q = [[NSDateFormatter alloc] init]; 
format1q.dateFormat = @"HH:mm"; 


NSString *StrDAte=[NSString stringWithFormat:@"%@",[format1q stringFromDate:utcDate]]; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
dateFormatter.dateFormat = @"HH:mm"; 
NSDate *date = [dateFormatter dateFromString:StrDAte]; 
date = [date dateByAddingTimeInterval:-60]; 

dateFormatter.dateFormat = @"hh:mm a"; 
NSString *pmamDateString = [dateFormatter stringFromDate:date]; 
1

по умолчанию выделенное NSDateFormatter будет использовать текущий язык (тот, что пользователь создан в Settings.app).

Вы должны явно установить подходящую локаль на форматере:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 

Этот язык используется григорианский календарь по Гринвичу без каких-либо настроек DST.

Редактировать: LeoDabus указывает, что установка locale не изменяет timezone формата даты. Это должно быть сделано явно:

dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) 
+0

Распределенный по умолчанию NSDateFormatter будет использовать текущий язык (тот, который пользователь установил в Settings.app). противоречит этому языку использует gregorian календарь в UTC без каких-либо корректировок DST. На самом деле, позже это неправильно. По умолчанию он будет использовать текущую локаль (местное время не UTC). Вам нужно указать secondsFromGMT –

+0

@LeoDabus Не уверен, что я понимаю противоречие, но хороший момент об ошибке со смещением от UTC. Спасибо, что указали это. –

Смежные вопросы