2017-03-15 19 views
6

サーバーのUTC時間を現地時間に変換したい場合は、逆の場合も同様です。 "12:52"Swift 3.0:サーバーのUTC時間を現地時間に換算すると

しかし、実際の現地時間と出力時間差がある:ここでは は、私は現地時間に

O/Pを取得

var isTimeFromServer = true 
var time:String! 
var period:String! 
let timeString = "6:59 AM" //Current UTC time 

if isTimeFromServer { 

    let index = timeString.index(timeString.startIndex, offsetBy: 5) 
    let twelve = timeString.substring(to: index) 

    var dateString:String! 

    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "H:mm" 
    let date12 = dateFormatter.date(from: twelve)! 

    dateFormatter.dateFormat = "h:mm a" 
    let date22 = dateFormatter.string(from: date12) 

    //print(date22) 
    dateString = date22 
    //print("dateString=\(dateString)") 

    time = dateString.components(separatedBy: " ")[0] 
    period = dateString.components(separatedBy: " ")[1] 

} 
else { 
    time = timeString.components(separatedBy: " ")[0] 
    period = timeString.components(separatedBy: " ")[1] 
} 

var hour = Int(time.components(separatedBy: ":")[0]) 

hour = period == "AM" ? hour : hour! + 12 
let minute = Int(time.components(separatedBy: ":")[1]) 
let calender = NSCalendar.current 
var datecomponent = DateComponents() 
datecomponent.calendar = calender 
datecomponent.hour = hour 
datecomponent.minute = minute 

if !isTimeFromServer { 
    // local to UTC 
    datecomponent.timeZone = TimeZone.current 
} 
else { 
    datecomponent.timeZone = TimeZone(abbreviation: "UTC") 
} 

let date = datecomponent.date 
let dateFormatter = DateFormatter() 

if !isTimeFromServer { 
    dateFormatter.dateFormat = "H:mm" 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 
    dateFormatter.string(from: date!) 
} 
else { 
    //UTC to local 
    dateFormatter.dateFormat = "h:mm a" 
    dateFormatter.timeZone = TimeZone.current 
    dateFormatter.string(from: date!) 
} 

..私のコードです23分。 これを解決するのを手伝ってください。前もって感謝します。

答えて

19

私はあなたのコードが悪いのか分かりません。
しかし、あなたがカレンダーを設定していて、文字列からいくつかの要素を取得しているような不必要なものがあまりにも多く見えます。 ここに私の小さなバージョンのUTCToLocalとlocalToUTC関数があります。
しかし、それは特定の形式で文字列を渡す必要があります。私は強制的にアンラップされた日付オブジェクトを持っています。しかし、あなたのアプリをクラッシュさせないために、いくつかのガード条件を使用することができます。

func localToUTC(date:String) -> String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "h:mm a" 
    dateFormatter.calendar = NSCalendar.current 
    dateFormatter.timeZone = TimeZone.current 

    let dt = dateFormatter.date(from: date) 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 
    dateFormatter.dateFormat = "H:mm:ss" 

    return dateFormatter.string(from: dt!) 
} 

func UTCToLocal(date:String) -> String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "H:mm:ss" 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 

    let dt = dateFormatter.date(from: date) 
    dateFormatter.timeZone = TimeZone.current 
    dateFormatter.dateFormat = "h:mm a" 

    return dateFormatter.string(from: dt!) 
} 

これらの関数を以下のように呼び出します。

print(UTCToLocal(date: "13:07:00")) 
print(localToUTC(date: "06:40 PM")) 

希望すると、これが役に立ちます。
ハッピーコーディング!

+1

これはまさに私が欲しいものです。ありがとう@Mrugesh。 – NiravS

+0

素晴らしい!ありがとう! – iDev750

+1

唯一の没落は不都合です。この関数の各反復には約0.23ミリ秒かかります。何千もの日付を比較するとこれは不便になります – quemeful

1

それを試してみてください:

func convertUTCToLocal(timeString: String) -> String? { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "h:mm a" 

    dateFormatter.timeZone = TimeZone.init(abbreviation: "UTC") 
    let timeUTC = dateFormatter.date(from: timeString) 

    if timeUTC != nil { 
     dateFormatter.timeZone = NSTimeZone.local 

     let localTime = dateFormatter.string(from: timeUTC!) 
     return localTime 
    } 

    return nil 
} 



func convertLocalToUTC(localTime: String) -> String? { 

    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "h:mm a" 
    dateFormatter.timeZone = NSTimeZone.local 
    let timeLocal = dateFormatter.date(from: localTime) 

    if timeLocal != nil { 
     dateFormatter.timeZone = TimeZone.init(abbreviation: "UTC") 

     let timeUTC = dateFormatter.string(from: timeLocal!) 
     return timeUTC 
    } 
    return nil 
} 


    var isTimeFromServer = true 
    var time:String! 
    var period:String! 
    let timeString = "6:59 AM" //Current UTC time 


    if isTimeFromServer { 
     print(convertUTCToLocal(timeString: timeString)) 
    } else { 
     print(convertLocalToUTC(localTime: timeString)) 
    } 
+3

*説明*は、今後の読者には役立ちます。質問のコードには何が問題なのですか?あなたは何を変えたのですか? –

5

Mrugeshの答えは完璧ですが、誰かが独自のフォーマットを使用する必要がある場合や、別のフォーマットで使用する必要がある場合は、一般化して両方のパラメータで異なるフォーマットまたは同じものを与えることができます。

func localToUTC(date:String, fromFormat: String, toFormat: String) -> String { 

    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = fromFormat 
    dateFormatter.calendar = NSCalendar.current 
    dateFormatter.timeZone = TimeZone.current 
    dateFormatter.date 
    let dt = (from: date) 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 
    dateFormatter.dateFormat = toFormat 

    return dateFormatter.string(from: dt!) 
} 

func UTCToLocal(date:String, fromFormat: String, toFormat: String) -> String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = fromFormat 
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC") 

    let dt = dateFormatter.date(from: date) 
    dateFormatter.timeZone = TimeZone.current 
    dateFormatter.dateFormat = toFormat 

return dateFormatter.string(from: dt!) 
} 

let localDateAsString = UTCToLocal(date: dateAsString!, fromFormat: "hh:mm a, dd MMM yyyy", toFormat: "hh:mm a, dd MMM yyyy") 

上記のように使用できます。それが役に立てば幸い。

+1

私はこれがより有用であることを発見しました... –

+0

完璧なソリューション!!!! – iDev750

+0

let dt = dateFormatter.date(from:date),,, lol:D – IsPha

関連する問題