2009-09-29 3 views

ответ

-3
- (NSDate*) convertToUTC:(NSDate*)sourceDate 
{ 
    NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone]; 
    NSTimeZone* utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"]; 

    NSInteger currentGMTOffset = [currentTimeZone secondsFromGMTForDate:sourceDate]; 
    NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:sourceDate]; 
    NSTimeInterval gmtInterval = gmtOffset - currentGMTOffset; 

    NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:sourceDate] autorelease]; 
    return destinationDate; 
} 
+13

-1 неправильно на очень многих уровнях –

+2

-1 Это '' NSDate' для преобразования NSDate' вводит в заблуждение и основано на неправильном представлении о том, что представляет собой объект 'NSDate'. – albertamg

+0

@Dave DeLong Я согласен с тем, что попытка конвертировать объекты NSDate между часовыми поясами - это бессмыслица, и я не понимаю, почему в этом другом ответе так много upvotes: http: //stackoverflow.com/questions/1081647/how-to-convert -time-to-the-timezone-of-the-iphone-device/1082179 # 1082179 – albertamg

0

NSDate сохраняет часовой пояс внутри - есть несколько функций, которые вы можете позвонить и передать в целевой часовой пояс, если вы хотите этого нужно просто строковое представление даты, см apple's documentation

8

Если это для целей отображения, которые вы хотите отобразить, используйте NSDateFormatter так:

NSDate *myDate = [NSDate date]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; 

// Set date style: 
[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

NSString *GMTDateString = [dateFormatter stringFromDate: myDate]; 
+0

Что делать, если время устройства на 2 часа позже. В этом случае этот расчет будет правильным ??? –

+0

Как вы узнали, если устройство опоздает на 2 часа? Вы можете работать только с тем, что вам дано, и должны полагаться на правильное время системы для любых случаев. Это работа системы, а не ваше приложение. –

+0

мы должны рассмотреть все сценарии, мой сценарий - я хочу получить время gmt независимо от времени устройства. , , есть ли другой способ достичь этого? –

9

Это более простой вариант ответа Рамин в

+ (NSDate *) GMTNow 
{ 
NSDate *sourceDate = [NSDate date]; 
    NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone]; 
    NSInteger currentGMTOffset = [currentTimeZone secondsFromGMT]; 

    [sourceDate addTimeInterval:currentGMTOffset]; 

    return sourceDate; 
} 
+1

Это неправильно. Если я нахожусь в NY currentGMOffset будет -14400. Поскольку GMT позже NYC, я хочу добавить положительное значение в sourceDate. Также здесь не был изменен sourceDate. Вам нужно sourceDate = [sourceDate addTimeInterval: currentGMTOffset * -1]; который инвертирует знак смещения. – ransomweaver

+0

Что делать, если время устройства на 2 часа позже. В этом случае это будет правильно? –

2
+ (NSDate*) convertToGMT:(NSDate*)sourceDate 
{ 
    NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone]; 

    NSTimeInterval gmtInterval = [currentTimeZone secondsFromGMTForDate:sourceDate]; 

    NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:sourceDate] autorelease];  
    return destinationDate; 
} 
+1

Это действительно очень полезный метод. Я буду использовать его в своем текущем проекте. Однако на самом деле он не отвечает на вопрос. Вопрос: «Как мне получить время по Гринвичу?» –

4

При выполнении вычислений даты, эти категории могут быть полезным. Преобразуя дату в «нормализованный» (то есть, имея один и тот же месяц, день и год, но при +1200 UTC), если вы затем выполните последующие вычисления с использованием NSCalendar, который также установлен в UTC (+[NSCalendar normalizedCalendar]) все будет работать.

@implementation NSDate (NormalizedAdditions) 

+ (NSDate *)normalizedDateFromDateInCurrentCalendar:(NSDate *)inDate 
{ 
    NSDateComponents *todayComponents = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) 
                     fromDate:inDate]; 
    [todayComponents setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
    [todayComponents setHour:12]; 

    return [[NSCalendar normalizedCalendar] dateFromComponents:todayComponents]; 
} 

+ (NSDate *)normalizedDate 
{ 
    return [self normalizedDateFromDateInCurrentCalendar:[NSDate date]]; 
} 

@end 

@implementation NSCalendar (NormalizedAdditions) 

+ (NSCalendar *)normalizedCalendar 
{ 
    static NSCalendar *gregorian = nil; 
    if (!gregorian) { 
     gregorian = [[NSCalendar alloc] 
        initWithCalendarIdentifier:NSGregorianCalendar]; 
     [gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
    } 
    return gregorian; 
} 

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