2017-03-15 1 views
6

서버 UTC 시간을 현지 시간으로 변환하고 그 반대의 경우도 마찬가지입니다. "12:52 PM"Swift 3.0 : 서버 UTC 시간을 현지 시간으로 변환하고 그 반대의 경우

그러나 실제 현지 시간 및 출력 시간 차이가 : 여기

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!) 
} 

내가

이 는 O/P

현지 시간을 얻을 .. 내 코드입니다 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 (날짜 :) ,,, lol : D – IsPha

관련 문제