iOS: возникает проблема с часовым поясом

Кажется, у меня сейчас проблемы с часовым поясом Apple. Я протестировал следующий код ниже, и он работает неправильно. Это то, что у меня есть до сих пор.

 NSDate *today = [NSDate date];

 NSDateFormatter *estDf = [[NSDateFormatter alloc] init];
 [estDf setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];
 [estDf setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

  NSString *stringDate = [estDf stringFromDate:today];
  NSDate *todaydateadjusted = [estDf dateFromString:stringDate];

  NSLog(@"Todays date is %@",[estDf stringFromDate:todaydateadjusted]);

Это мой ответ NSLog.
Todays date is 2015-03-09 16:25:02

Я ожидал 17:25:02, а не 16:25:02. Поскольку сейчас 5 часов вечера по стандартному времени, он должен распечатать 17 вместо 16. У кого-нибудь еще есть эта проблема? Возможно, что-то не так с моим кодом.


person William Alex    schedule 09.03.2015    source источник
comment
Изменить: я попробовал EDT и тот же результат   -  person William Alex    schedule 10.03.2015
comment
Если вы случайно прокатились на Delorean с незнакомцем, я вам завидую. Как говорится в ответах, ваше время выключено: timeanddate.com/time/zones/est   -  person A-Live    schedule 10.03.2015


Ответы (2)


Сейчас есть летнее время. Разве вы не должны использовать EDT вместо этого?

Другое дело — название часового пояса и аббревиатура часового пояса. Взгляните на этот пример — я написал его на Swift, но я думаю, что его должно быть легко понять и перевести на ObjC.

var now = NSDate()
var df = NSDateFormatter()
df.timeZone = NSTimeZone(abbreviation: "EDT")
//df.timeZone = NSTimeZone(name: "EDT") <- wrong
df.dateFormat = "yyyy-MM-dd HH:mm:ss"
let edt = df.stringFromDate(now)

Если вы хотите использовать полное название часового пояса, используйте, например, df.timeZone = NSTimeZone(name: "America/New_York")

person MirekE    schedule 09.03.2015
comment
Он печатает правильно 18:30. Убедитесь, что вы используете либо EDT с аббревиатурой, либо America/New_York или аналогичную для timeZoneWithName. На данный момент ваш код предназначен для timeZoneWithName, но вы передаете аббревиатуру. Это дает мне фиктивное время. - person MirekE; 10.03.2015

вам нужно изменить это:

[estDf setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];

к этому:

[esfDf setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EDT"]];
person Steve    schedule 09.03.2015