2015-04-01 19 views
31

Ricevo dal server una data stringa in fuso orario UTC e devo convertirlo nel fuso orario locale.Conversione del formato data UTC in nsdate locale

mio codice:

let utcTime = "2015-04-01T11:42:00.269Z"  
let dateFormatter = NSDateFormatter() 
dateFormatter.timeZone = NSTimeZone(name: "UTC") 
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 
let date = dateFormatter.dateFromString(utcTime) 
println("utc: \(utcTime), date: \(date)") 

questo stampe -

UTC: 2015-04-01T11: 42: 00.269Z, data: Opzionale (2015/04/01 11:42:00 +0000)

se tolgo

dateFormatter.timeZone = NSTimeZone(name: "UTC") 

esso stampa

UTC: 2015-04-01T11: 42: 00.269Z, data: Opzionale (2015-04-01 08:42:00 +0000)

il mio fuso orario locale è UTC +3 e nella prima opzione ottengo UTC nella seconda opzione ottengo UTC -3

dovrei ottenere

UTC: 2015-04-01T11: 42: 00.269Z, data: opzionale (2015/04/01 14:42: 00 + 0000)

Quindi, come posso convertire il formato della data UTC in ora locale?

+0

Hai provato formatter.timeZone = NSTimeZone.localTimeZone() – boidkan

+0

sì, ricevo UTC -3 ... utc: 2015-04-01T11: 42: 00.269Z, data: Opzionale (2015-04-01 08:42:00 +0000) – ilan

+1

http: // stackoverflow .com/questions/23564769/convert-utc-to-local-time-in-objective-c – boidkan

risposta

56

Qualcosa lungo il seguente lavorato per me in Objective-C:

// create dateFormatter with UTC time format 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
NSDate *date = [dateFormatter dateFromString:@"2015-04-01T11:42:00"]; // create date from string 

// change to a readable time format and change to local time zone 
[dateFormatter setDateFormat:@"EEE, MMM d, yyyy - h:mm a"]; 
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; 
NSString *timestamp = [dateFormatter stringFromDate:date]; 

continuo a questi due siti web a portata di mano per la conversione di diversi formati di ora: http://www.w3.org/TR/NOTE-datetime

http://benscheirman.com/2010/06/dealing-with-dates-time-zones-in-objective-c/

In Swift lo farà be:

// create dateFormatter with UTC time format 
let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
dateFormatter.timeZone = NSTimeZone(name: "UTC") 
let date = dateFormatter.dateFromString("2015-04-01T11:42:00")// create date from string 

// change to a readable time format and change to local time zone 
dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" 
dateFormatter.timeZone = NSTimeZone.localTimeZone() 
let timeStamp = dateFormatter.stringFromDate(date!) 
+0

Questo è oro, grazie – po5i

+8

In swift3, l'equivalente sarà: '' 'dateFormatter.timezone = TimeZone.current' '' – KingChintz

+0

let date = dateFormatter.dateFromString ("2015-04-01T11: 42: 00") Questo assegna fino ad ora quando imposto il formato orario di 12 ore nelle impostazioni del dispositivo. –

24

versione Swift di risposta c_rath:

// create dateFormatter with UTC time format 
let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
dateFormatter.timeZone = NSTimeZone(name: "UTC") 
let date = dateFormatter.dateFromString("2015-04-01T11:42:00") 

// change to a readable time format and change to local time zone 
dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" 
dateFormatter.timeZone = NSTimeZone.localTimeZone() 
let timeStamp = dateFormatter.stringFromDate(date!) 
+1

La riga 5 dovrebbe contenere: dateFormatter.dateFormat = "EEE, MMM d, yyyy - h: mm a" e la riga 6 dovrebbe contenere: dateFormatter.timeZone = NSTimeZone.localTimeZone() – dotToString

+0

È fantastico, grazie! – rilar

4

espansione su quello che altri hanno detto, ecco un utile NSDate estensione a Swift

import Foundation 

extension NSDate { 
    func ToLocalStringWithFormat(dateFormat: String) -> String { 
     // change to a readable time format and change to local time zone 
     let dateFormatter = NSDateFormatter() 
     dateFormatter.dateFormat = dateFormat 
     dateFormatter.timeZone = NSTimeZone.localTimeZone() 
     let timeStamp = dateFormatter.stringFromDate(self) 

     return timeStamp 
    } 
} 
3

Forse si può provare qualcosa di simile:

extension NSDate { 
    convenience init(utcDate:String, dateFormat:String="yyyy-MM-dd HH:mm:ss.SSS+00:00") { 
     // 2016-06-06 00:24:21.164493+00:00 
     let dateFormatter = NSDateFormatter() 
     dateFormatter.dateFormat = dateFormat 
     dateFormatter.timeZone = NSTimeZone(name: "UTC") 

     let date = dateFormatter.dateFromString(utcDate)! 
     let s = NSTimeZone.localTimeZone().secondsFromGMTForDate(date) 
     let timeInterval = NSTimeInterval(s) 

     self.init(timeInterval: timeInterval, sinceDate:date) 
    } 
} 
6

In Swift 3 funziona bene:

// create dateFormatter with UTC time format 
let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 
let date = dateFormatter.date(from: "2015-04-01T11:42:00")// create date from string 

// change to a readable time format and change to local time zone 
dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" 
dateFormatter.timeZone = TimeZone.current 
let timeStamp = dateFormatter.string(from: date!) 
1

Ho dovuto rimuovere sia z che milli secondi dalla soluzione c_rath. Lavori in rapida 4.

extension String { 
    func fromUTCToLocalDateTime() -> String { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" 
     dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 
     var formattedString = self.replacingOccurrences(of: "Z", with: "") 
     if let lowerBound = formattedString.range(of: ".")?.lowerBound { 
      formattedString = "\(formattedString[..<lowerBound])" 
     } 

     guard let date = dateFormatter.date(from: formattedString) else { 
      return self 
     } 

     dateFormatter.dateFormat = "EEE, MMM d, yyyy - h:mm a" 
     dateFormatter.timeZone = TimeZone.current 
     return dateFormatter.string(from: date) 
    } 
} 
1

Prova questa estensione Swift

Swift 4: UTC/GMT ⟺ locale (corrente/System)

extension Date { 

    // Convert local time to UTC (or GMT) 
    func toGlobalTime() -> Date { 
     let timezone = TimeZone.current 
     let seconds = -TimeInterval(timezone.secondsFromGMT(for: self)) 
     return Date(timeInterval: seconds, since: self) 
    } 

    // Convert UTC (or GMT) to local time 
    func toLocalTime() -> Date { 
     let timezone = TimeZone.current 
     let seconds = TimeInterval(timezone.secondsFromGMT(for: self)) 
     return Date(timeInterval: seconds, since: self) 
    } 

} 


// Try it 
let utcDate = Date().toGlobalTime() 
let localDate = utcDate.toLocalTime() 

print("utcDate - (utcDate)") 
print("localDate - (localDate)") 
Problemi correlati