NSDate, изразена в различни часови зони, т.е. местна часова зона (GMT-400) до PST

Знам как да използвам NSTimeZone, за да извлека отместването за текущото време в друга часова зона. NSDate винаги се връща спрямо GMT, така че как да извлека низ с правилната информация за часовата зона? т.е. вземам текущото време там, където съм (в EST) и използвайки NSTimeZone, в крайна сметка изваждам 3 часа, необходими за представяне на времето в PST. Но всичко, което направих, е да извадя 3 часа от времето, което все още е представено спрямо моята часова зона. Как да накарам NSDateFormatter да изплюе часа, използвайки часовата зона на местоназначението?

Един подход, който опитах беше:

NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];
NSTimeZone *tz = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)]; // for PST
NSDateComponents *dc = [cal components: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:now];
[cal setTimeZone:tz];
NSDate *newDate = [cal dateFromComponents:dc];

Няма любов. Бих могъл да взема отделните компоненти на датата и да съставя низ, но той няма да може да се локализира.

Свързан проблем:

NSTimeZone *tz = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)]; // for PST
NSString *abbreviation = [tz abbreviation];
NSString *name = [tz name];

И abbreviation, и name в крайна сметка връщат GMT-0800, а не PST, както бих очаквал. Така че дори не бих могъл да направя горното, ако исках. какво правя грешно


person rsswtmr    schedule 23.03.2010    source източник


Отговори (1)


NSDate винаги се връща спрямо GMT

Това няма смисъл. NSDate просто капсулира абсолютен момент във времето (нека забравим за относителността за секунда) и няма никаква концепция за часови зони. Да се ​​каже, че часовете на NSDate са относителни спрямо GMT, е погрешно.

За да изведете дата в конкретна часова зона, трябва да създадете екземпляр на NSDateFormatter и да извикате setTimeZone: върху него, за да зададете часовата зона. Според документи на Unicode, форматиращият низ @"zzz" трябва да изведе часовата зона стойност като "PST".

person Ole Begemann    schedule 23.03.2010
comment
Методът NSDateFormatter setTimeZone: беше нещото, което пренебрегнах. Благодаря. Разбирам как работи NSDate; това, което имах предвид, беше, че NSDateFormatter (или описание) винаги изразяваше времето в моята часова зона. Другият проблем все още остава: NSDate *now = [NSDate дата]; NSTimeZone *tz = [NSTimeZone timeZoneForSecondsFromGMT:-7*3600]; NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@'Updated' EEE MMM dd 'at' h:mm a zzz]; [df setTimeZone:tz]; NSString *s = [df stringFromDate:now]; Все още дава: Актуализирано на сряда, 24 март в 5:55 ч. GMT-07:00 - person rsswtmr; 24.03.2010
comment
Хм, може би NSDateFormatter разпознава само тези спецификатори на формата на часовата зона, когато преобразува низ от дата в NSDate, а не обратното? Спецификациите на Unicode, към които се свързах по-горе, изглежда дават на изпълнителите много свобода на действие как да показват информация за часови зони, ако имената на часовите зони не са налични. Наистина не знам как работи в детайли. И гугълът също не разкрива много. - person Ole Begemann; 24.03.2010
comment
Експериментирах малко и открих, че форматиращият низ @"zzz" наистина ще изведе PDT (за днешна дата). Това обаче ще работи само ако часовата зона, която сте задали за инструмента за форматиране на дата, е създадена с име или съкращение вместо само с броя секунди от GMT: [NSTimeZone timeZoneWithAbbreviation:@"PST"]. Предполагам, че това има смисъл, тъй като иначе системата няма начин да разбере коя конкретна часова зона имате предвид. Също така трябваше изрично да настроя локала на програмата за форматиране на дата на en-US. - person Ole Begemann; 24.03.2010
comment
Да, вчера ми беше посочено, че GMT-05:00 може също толкова лесно да представлява времето в Перу или Колумбия, както и източното стандартно време. Отново, не знам защо това не ми хрумна. Единствената информация за часовата зона, която получавам от нашите сървъри, е часове, изместени спрямо GMT, така че предполагам, че ще трябва да се откажем от хубавото описание на часовата зона. Благодаря за вашата помощ. - person rsswtmr; 26.03.2010