2011-10-20 19 views
16

Mam następującą datę:Nie można sformatować UTC datę z NSDateFormatter

2011-10-20T01:10:50Z 

chciałbym to być sformatowany do

"M/d/yy 'at' h:mma" 

Oto mój kod:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; 
    //The Z at the end of your string represents Zulu which is UTC 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
    [dateFormatter setDateFormat:@"yyyy-dd-MM'T'HH:mm:ss'Z'"]; 
    NSDate* newTime = [dateFormatter dateFromString:[message valueForKey:@"created_at"]]; 

    //Add the following line to display the time in the local time zone 
    [dateFormatter setTimeZone:[NSTimeZone systemTimeZone]]; 
    [dateFormatter setDateFormat:@"M/d/yy 'at' h:mma"]; 
    NSString* finalTime = [dateFormatter stringFromDate:newTime]; 
    [dateFormatter release]; 
    NSLog(@"%@", finalTime);  

Niestety, czas ostateczny jest NULL tutaj.

Odpowiedz

30

Masz dd-MM wstecz. Masz 10 dla dd i 20 MM. Nie ma 20 miesięcy.

2011-10-20T01:10:50Z 
@"yyyy-dd-MM'T'HH:mm:ss'Z'" 

Z tego powodu newTime ma wartość zerową, a czas ostateczny jest zerowy.

Oto z poprawką. To:

NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; 

//The Z at the end of your string represents Zulu which is UTC 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; 

NSDate* newTime = [dateFormatter dateFromString:@"2011-10-20T01:10:50Z"]; 
NSLog(@"original time: %@", newTime); 

//Add the following line to display the time in the local time zone 
[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]]; 
[dateFormatter setDateFormat:@"M/d/yy 'at' h:mma"]; 
NSString* finalTime = [dateFormatter stringFromDate:newTime]; 
NSLog(@"%@", finalTime);  

[dateFormatter release]; 

Wyjścia:

2011-10-19 22:05:15.107 Craplet[4231:707] original time: 2011-10-20 01:10:50 +0000 
2011-10-19 22:05:15.116 Craplet[4231:707] 10/19/11 at 9:10PM 
+8

Ciekawa nazwa dla aplikacji tam testowym w dziennikach! –

+1

+1 dla 'dateFormatter setTimeZone'. Tego właśnie potrzebowałem wiedzieć. :) – devios1

14

Ta uwaga techniczna pomógł mi rozwiązać ten sam problem: https://developer.apple.com/library/ios/qa/qa1480/_index.html

W skrócie, trzeba ustawić 3 rzeczy na NSDateFormatter:

  1. Lokalizacja
  2. TimeZone
  3. DateFormat

przykładowy kod:

NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; 
[dateFormatter setLocale:locale]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'"]; 

NSDate *date = [dateFormatter dateFromString:@"2014-10-23T01:10:50.000Z"]; 

używałem NSDateFormatter skutecznie analizować UTC ciągi do NSDate tylko przez ustawienie strefę czasową i format daty. Kiedy nagle przestał działać, znalazłem tę notatkę techniczną i dodano setLocal: która rozwiązała problem.

3

Ponieważ SWIFT:

let dateFormatter = NSDateFormatter() 
dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC") 
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'" 
let dateHopefully = dateFormatter.dateFromString("2016-07-29T17:15:02Z") 

dateFormatter.timeZone = NSTimeZone.systemTimeZone() 
dateFormatter.dateFormat = "M/d/yy 'at' h:mma" 
let lastTime = dateFormatter.stringFromDate(dateHopefully!) 

print("Here is the hopeful date \(dateHopefully) and here is the lastTime \(lastTime)") 
Powiązane problemy