NSDate - Convert Date to GMT NSDate - Convert Date to GMT ios ios

NSDate - Convert Date to GMT


NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm";        NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];[dateFormatter setTimeZone:gmt];NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];[dateFormatter release];


Working with time in Cocoa can be complicated. When you get an NSDate object, it's in the local time zone. [[NSTimeZone defaultTimeZone] secondsFromGMT] gives you the offset of the current time zone from GMT. Then you can do this:

NSDate *localDate = // get the dateNSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone methodNSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];

Now gmtDate should have the correct date in GMT for you. In order to display it, look at NSDateFormatter, specifically the setDateStyle and setTimeStyle methods. You create an NSDateFormatter, configure it the way you want, and then call stringFromDate: to get a nicely formatted string.


Howard's Answer is correct and please vote it up and accept it.

For reference I think it is useful to explain the difference between date objects and localised date representations are.

In many programming languages date objects are used to represent unique points in time. Ignoring Relativistic arguments it can be assumed that at any instance we can define a point in time which is equal universally for every one, regardless of how we measure time.

If for each point in time we could construct a unique label, that label could be passed around and referenced unambiguously. The purpose of date objects is to act as a unique universal label for a given point in time.

One could come up with any number of techniques to construct such a labelling scheme and how each date object chooses to do so is immaterial to anyone using them.

An example may be to use a numeric offset from a universal event (X seconds since the sun exploded).

It is only when we wish to take a time point and serialize it into a human readable string that we must deal with the complexities of time zones, locales, etc...

(Local Date String) + (Date Formatter) => Time Point

Time Point + (Date Formatter) => (Local Date String)

Every time point is universal... there is no such thing as a new york time point, or gmt time point, only once you convert a time point to a local string (using a date formatter) does any association to a time zone appear.

Note: I'm sure there are many blogs/articles on this very issue, but my google foo is failing me at this hour. If anyone has the enthusiasm to expand on this issue please feel free to do so.