2016-10-19 5 views
9

में मिलीसेकंड की तारीख और अद्यतित तिथि मैं यूटीसी में वर्तमान समय ले रहा हूं, और इसे नैनोसेकंड में डाल रहा हूं और फिर मुझे नैनोसेकंड लेने और स्थानीय समय में एक तारीख पर वापस जाने की आवश्यकता है। मैं नैनोसेकंड का समय प्राप्त करने में सक्षम हूं और फिर एक तारीख स्ट्रिंग पर वापस आ सकता हूं लेकिन जब मैं स्ट्रिंग से डेट पर जाता हूं तो समय घुल जाता है।स्विफ्ट

//Date to milliseconds 
    func currentTimeInMiliseconds() -> Int! { 
      let currentDate = NSDate() 
      let dateFormatter = DateFormatter() 
      dateFormatter.dateFormat = format 
      dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone! 
      let date = dateFormatter.date(from: dateFormatter.string(from: currentDate as Date)) 
      let nowDouble = date!.timeIntervalSince1970 
      return Int(nowDouble*1000) 
     } 

    //Milliseconds to date 
    extension Int { 
     func dateFromMilliseconds(format:String) -> Date { 
      let date : NSDate! = NSDate(timeIntervalSince1970:Double(self)/1000.0) 
      let dateFormatter = DateFormatter() 
      dateFormatter.dateFormat = format 
      dateFormatter.timeZone = TimeZone.current 
      let timeStamp = dateFormatter.string(from: date as Date) 

let formatter = DateFormatter() 
      formatter.dateFormat = format 
      return (formatter.date(from: timeStamp))! 
     } 
    } 

// टाइमस्टैम्प सही है लेकिन आज वापस नहीं है

+1

स्ट्रिंग और सही समय पर तारीख को बदलने का उद्देश्य क्या है ('currentTimeInMiliseconds()' में)? – vadian

+0

कंपनी जो मैं स्टोर के लिए काम करता हूं, मिलीसेकंड – user1079052

+1

में सभी तिथियां हैं, लेकिन डबल रूपांतरण दिनांक -> स्ट्रिंग -> दिनांक क्या है और कोड में क्या दिया गया है 'प्रारूप' क्या है? – vadian

उत्तर

44

मुझे समझ नहीं आता कि आप तार के साथ कुछ भी क्यों कर रहे हो ...

extension Date { 
    var millisecondsSince1970:Int { 
     return Int((self.timeIntervalSince1970 * 1000.0).rounded()) 
    } 

    init(milliseconds:Int) { 
     self = Date(timeIntervalSince1970: TimeInterval(milliseconds/1000)) 
    } 
} 


Date().millisecondsSince1970 // 1476889390939 
Date(milliseconds: 0) // "Dec 31, 1969, 4:00 PM" (PDT variant of 1970 UTC) 
+0

मैं स्ट्रिंग कर रहा हूं क्योंकि मुझे मिलीसेकंड्स की आवश्यकता है 1 9 70 यूटीसी में होना चाहिए और init (मिलीसेकंड: Int) होना चाहिए स्थानीय समय में वापस रखो। – user1079052

+2

तिथि वस्तुओं * हमेशा * यूटीसी में हैं। मेरे उदाहरण में वे मान यूटीसी हैं (नोट करें कि विवरण विधि तब पीडीटी में शुरू होने वाले यूटीसी युग को प्रस्तुत करती है)। –

+2

Int के बजाय init (मिलीसेकंड: डबल) करने के लिए बेहतर है या फिर आप वापस कनवर्ट करते समय मिलीसेकंड खो देंगे। – dickyj

2
let dateTimeStamp = NSDate(timeIntervalSince1970:Double(currentTimeInMiliseconds())/1000) //UTC time //YOUR currentTimeInMiliseconds METHOD 
let dateFormatter = NSDateFormatter() 
dateFormatter.timeZone = NSTimeZone.localTimeZone() 
dateFormatter.dateFormat = "yyyy-MM-dd" 
dateFormatter.dateStyle = NSDateFormatterStyle.FullStyle 
dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle 


let strDateSelect = dateFormatter.stringFromDate(dateTimeStamp) 
print("Local Time", strDateSelect) //Local time 


let dateFormatter2 = NSDateFormatter() 
dateFormatter2.timeZone = NSTimeZone(name: "UTC") as NSTimeZone! 
dateFormatter2.dateFormat = "yyyy-MM-dd" 

let date3 = dateFormatter.dateFromString(strDateSelect) 
print("DATE",date3) 
4
//Date to milliseconds 
func currentTimeInMiliseconds() -> Int { 
    let currentDate = Date() 
    let since1970 = currentDate.timeIntervalSince1970 
    return Int(since1970 * 1000) 
} 

//Milliseconds to date 
extension Int { 
    func dateFromMilliseconds() -> Date { 
     return Date(timeIntervalSince1970: TimeInterval(self)/1000) 
    } 
} 

मैं स्ट्रिंग के माध्यम से मालूम होता है बेकार रूपांतरण हटा दिया और उन सभी यादृच्छिक !

+0

पर विचार किए बिना केवल दोहरा मूल्य है, लेकिन यह बहुत अच्छा होगा, लेकिन मुझे स्थानीय समय को यूटीसी में बदलने के लिए वर्तमान टाइमइममिलिस्कंड की आवश्यकता है और मुझे यूटीसी से स्थानीय समय में कनवर्ट करने के लिए तिथि MMMMMIMISConds की आवश्यकता है – user1079052

+0

[टाइमस्टैम्प ** ** यूटीसी में है पहले से ही।] (https://developer.apple.com/reference/foundation/nsdate/1416453-init)। > 'संदर्भ दिनांक (00:00:00 ** यूटीसी ** 1 जनवरी 1 9 70 को) से सेकंड की संख्या) – user28434

10

रूप @Travis समाधान काम करता है, लेकिन कुछ मामलों

var millisecondsSince1970:Intक्रैश आवेदन मज़बूर हो जाएंगे,

त्रुटि

डबल मान कर सकते हैं अगर यह होने से Int64 के साथ अपने जवाब को अद्यतन Int क्योंकि परिणाम Int.max से अधिक होना होगा नहीं परिवर्तित किया जा

यहाँ

उत्तर

extension Date { 
var millisecondsSince1970:Int64 { 
     return Int64((self.timeIntervalSince1970 * 1000.0).rounded()) 
     //RESOLVED CRASH HERE 
    } 

    init(milliseconds:Int) { 
     self = Date(timeIntervalSince1970: TimeInterval(milliseconds/1000)) 
    } 
} 

आशा है कि यह किसी के लिए उपयोगी है अपडेट किया जाता है, जो एक ही समस्या है

+2

वह त्रुटि क्यों होगी? 1 9 70 के बाद से अंतराल 32 बिट संख्या है। कम से कम जब तक हम इसे प्राप्त न करें: https://en.wikipedia.org/wiki/Year_2038_problem – DoesData

+1

@DoesData यदि आप देखते हैं कि हम 1000 के साथ संख्या गुणा कर रहे हैं।यह Int32 की सीमा से बाहर होता है –