2017-03-15 12 views
6

मैं सर्वर यूटीसी समय को स्थानीय समय और वीजा-विपरीत में कनवर्ट करना चाहता हूं। यहाँ मेरी कोड है ..स्विफ्ट 3.0: सर्वर यूटीसी समय को स्थानीय समय में बदलें और वीजा-विपरीत

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

मैं स्थानीय समय

ओ/p मिलती है: "12:52 PM"

लेकिन वास्तविक स्थानीय समय और उत्पादन समय का अंतर है 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

यह वही है जो मैं चाहता हूं .. धन्यवाद @ मुरुश। – 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

मुरुष का जवाब सही है, लेकिन अगर किसी को अपने प्रारूपों का उपयोग करने की ज़रूरत है, या कुछ अलग प्रारूप में, मैंने इसे सामान्यीकृत किया है ताकि आप दोनों पैरामीटर में अलग प्रारूप या समान दे सकें।

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

dt = dateFormatter.date (से: दिनांक) ,, lol: D – IsPha

संबंधित मुद्दे