2009-09-29 19 views

Antwort

-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 falsch auf so vielen Ebenen –

+2

-1 Diese 'NSDate' zu' NSDate' Umwandlung ist irreführend und basiert auf einem Missverständnis dessen, was ein 'NSDate' Objekt darstellt. – albertamg

+0

@Dave DeLong Ich stimme zu, dass der Versuch, NSDate-Objekte zwischen Zeitzonen zu konvertieren, Unsinn ist und ich nicht verstehe, warum diese andere Antwort so viele upvotes hat: http: //stackoverflow.com/questions/1081647/how-to-convert -time-to-the-time-of-the-iphone-device/1082179 # 1082179 – albertamg

0

NSDate speichert die Zeitzone intern - es gibt ein paar Funktionen, die Sie in einer Zielzeitzone aufrufen und übergeben, wenn Sie jsut eine String-Darstellung des Datums wollen, apple's documentation

8

Wenn es für die Anzeige ist wollen Sie, um sie anzuzeigen, verwenden Sie NSDateFormatter wie so:

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

Was ist, wenn die Gerätezeit 2 Stunden zu spät ist. In diesem Fall wird diese Berechnung korrekt sein ??? –

+0

Wie würden Sie wissen, ob das Gerät 2 Stunden zu spät kommt? Sie können nur mit dem arbeiten, was Ihnen gegeben wurde, und müssen sich darauf verlassen, dass die Systemzeit für alle Fälle korrekt ist. Dies ist die Aufgabe des Systems, nicht Ihre App. –

+0

wir müssen alle szenarien berücksichtigen, mein szenario ist ich will gmt zeit unabhängig von gerätezeit bekommen. . . Gibt es einen anderen Weg, dies zu erreichen? –

9

Dies ist eine einfachere Version von Ramin Antwort

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

    [sourceDate addTimeInterval:currentGMTOffset]; 

    return sourceDate; 
} 
+1

Das ist aber falsch. Wenn ich in NY bin, ist currentGMOffset -14400. Da GMT später als NYC ist, möchte ich SourceDate einen positiven Wert hinzufügen. Auch sourceDate wurde hier nicht geändert. Sie benötigen sourceDate = [sourceDate addTimeInterval: currentGMTOffset * -1]; welches das Vorzeichen des Offsets invertiert. – ransomweaver

+0

was ist, wenn die Gerätezeit 2 Stunden zu spät ist. In diesem Fall wird diese Berechnung korrekt sein ??? –

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

Dies ist eigentlich eine sehr gute Hilfsmethode. Ich werde es in meinem aktuellen Projekt verwenden. Allerdings beantwortet es die Frage nicht wirklich. Die Frage war: "Wie bekomme ich GMT-Zeit?" –

4

Wenn Datumsberechnungen durchführen, diese Kategorien können nützlich sein. Nachdem Sie Ihr Datum in "normalisiert" umgewandelt haben (dh, Sie haben denselben Monat, Tag und Jahr, aber +1200 UTC), wenn Sie anschließend Berechnungen mit einem NSCalendar durchführen, der ebenfalls auf UTC (+[NSCalendar normalizedCalendar]) gesetzt ist, ll alles klappt.

@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