स्विफ्ट में वर्तमान समय में मिनट कैसे जोड़ें


109

मैं स्विफ्ट के लिए नया हूं और एक शेड्यूलर की कोशिश कर रहा हूं। मेरे पास प्रारंभ समय चयनित है और मुझे प्रारंभ समय में 5 मिनट (या इसके गुणक) को जोड़ने और इसे UILabel में प्रदर्शित करने की आवश्यकता है?

    @IBAction func timePickerClicked(sender: UIDatePicker) {
    var dateFormatter = NSDateFormatter()
    dateFormatter.timeStyle = NSDateFormatterStyle.ShortStyle
    var dateStr = dateFormatter.stringFromDate(startTime.date)
    let sttime = dateStr
    startTimeDisplay.text = dateStr
    }

   // How to advance time by 5 minutes for each section based on the   start time selected and display time 
   // section 1 = start time + 5
   // section 2 = start time + 10*

जवाबों:


271

दो दृष्टिकोण:

  1. का उपयोग करें Calendarऔर date(byAdding:to:wrappingComponents:)। जैसे, स्विफ्ट 3 में और बाद में:

    let calendar = Calendar.current
    let date = calendar.date(byAdding: .minute, value: 5, to: startDate)
  2. बस एक (यानी कुछ सेकंड की संख्या ) जोड़ने के लिए +ऑपरेटर (देखें +(_:_:)) का उपयोग करें TimeInterval। उदाहरण के लिए, पाँच मिनट जोड़ सकते हैं:

    let date = startDate + 5 * 60

    (ध्यान दें, यहां आदेश विशिष्ट है: बाईं ओर की +तारीख और दाईं ओर सेकंड।)

    आप भी उपयोग कर सकते हैं addingTimeInterval, यदि आप चाहें तो:

    let date = startDate.addingTimeInterval(5 * 60)

निचला रेखा, +/ addingTimeIntervalसरल परिदृश्यों के लिए सबसे आसान है, लेकिन यदि आप कभी भी बड़ी इकाइयां जोड़ना चाहते हैं (जैसे, दिन, महीने, आदि), तो आप संभवतः कैलेंड्रिकल गणनाओं का उपयोग करना चाहेंगे, क्योंकि वे दिन के उजाले की बचत के लिए समायोजित करते हैं, जबकि addingTimeIntervalऐसा नहीं होता है ।


स्विफ्ट 2 प्रस्तुतिकरण के लिए, इस उत्तर के पिछले संशोधन को देखें ।


इन 2 दृष्टिकोणों में से कौन अधिक बेहतर है? addTimeInterval या Calendar.date (byAdding ...
निशांत

3
addingTimeIntervalनिस्संदेह अधिक performant (जब तक आप समय की इस लाखों लोगों की कर रहे हैं सामग्री नहीं है, हालांकि संभावना) है। हालांकि, अधिक महत्वपूर्ण बात यह है कि अगर आप दिनों में (या उससे अधिक) माप की इकाइयों के बारे में बात कर रहे हैं, तो कैलेंड्रिकल रेंडरन बेहतर है, क्योंकि यह आपके लिए दिन के बचत के सभी समायोजन करेगा।
रॉब

40

आप कैलेंडर की विधि का उपयोग कर सकते हैं

func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date?

किसी भी को जोड़ने के Calendar.Componentलिए Date। आप अपनी तिथि में x मिनट जोड़ने के लिए एक तिथि विस्तार बना सकते हैं UIDatePicker:

Xcode 8 और Xcode 9 • स्विफ्ट 3.0 और स्विफ्ट 4.0

extension Date {
    func adding(minutes: Int) -> Date {
        return Calendar.current.date(byAdding: .minute, value: minutes, to: self)!
    }
}

तब आप केवल प्रेषक (UIDatePicker) में मिनट जोड़ने के लिए एक्सटेंशन विधि का उपयोग कर सकते हैं:

let section1 = sender.date.adding(minutes: 5)
let section2 = sender.date.adding(minutes: 10)

खेल का मैदान परीक्षण:

Date().adding(minutes: 10)  //  "Jun 14, 2016, 5:31 PM"

किन परिस्थितियों में .date(byAdding:value:to)वापसी करता है nil? क्या हम यहां अनफ्रेंड करने के लिए सुरक्षित हैं?
डेक्कन मैक्केना

@ डेको डेट रिटर्न शून्य में मिनट कैसे जोड़ेगा? यदि दुनिया परिणामी तारीख को समाप्त नहीं होती है तो आप सुरक्षित हैं :)
सिंह Dabus

2
प्रलेखन स्पष्ट नहीं है कि यह शून्य कैसे लौट सकता है। यह सवाल समझाता है, आप सही हैं कि यह पूरी तरह से यहाँ सुरक्षित है। stackoverflow.com/questions/39358131/…
डेक्लान मैककेना

21

स्विफ्ट 4 :

// तिथि में 5 मिनट जोड़ें

let date = startDate.addingTimeInterval(TimeInterval(5.0 * 60.0))

// दिनांक से 5 मिनट घटाएं

let date = startDate.addingTimeInterval(TimeInterval(-5.0 * 60.0))

स्विफ्ट 5.1:

// subtract 5 minutes from date
transportationFromDate.addTimeInterval(TimeInterval(-5.0 * 60.0))

4

आप तारीख अंकगणित का उपयोग करके कर सकते हैं NSDateComponents। उदाहरण के लिए:

import Foundation

let comps = NSDateComponents()

comps.minute = 5

let cal = NSCalendar.currentCalendar()

let r = cal.dateByAddingComponents(comps, toDate: NSDate(), options: nil)

जब आप इसे खेल के मैदान में आजमाते हैं तो यह आपको दिखाई देता है

यहां छवि विवरण दर्ज करें



4

इस छोटे से विस्तार को बचाएं:

extension Int {

 var seconds: Int {
    return self
 }

 var minutes: Int {
    return self.seconds * 60
 }

 var hours: Int {
    return self.minutes * 60
 }

 var days: Int {
    return self.hours * 24
 }

 var weeks: Int {
    return self.days * 7
 }

 var months: Int {
    return self.weeks * 4
 }

 var years: Int {
    return self.months * 12
 }
}

फिर इसे सहजता से उपयोग करें जैसे:

let threeDaysLater = TimeInterval(3.days)
date.addingTimeInterval(threeDaysLater)

2
दुर्भाग्य से, महीने और साल गलत हैं। * ४ * १२ = ३३६, यह ३६५ से बहुत कम है।
क्लिम्मककम

1
इस तरह महीनों की गणना करके इसे सुधारा जा सकता है: self.days * 30और वर्ष self.days * 365:। यह सही नहीं है क्योंकि वर्ष में 366 दिन हो सकते हैं, और माह 30 दिनों से भिन्न हो सकते हैं, लेकिन यह अभी भी 28/336 से बेहतर है।
KlimczakM

2
आपको ऊपर सूचीबद्ध सभी कारणों के लिए निश्चित रूप से इसका उपयोग नहीं करना चाहिए, यह विभिन्न मामलों के एक समूह में गलत है। अंतर्निहित डेटा अंकगणितीय कार्यों का उपयोग करें
स्टीवन स्टेफ़ानिक

1
महीने हमेशा 4 सप्ताह के बराबर नहीं होते हैं, यह भी कि इसके साथ लीप वर्ष कैसे होता है?
मेहदी चेंनौफी

3

आप स्विफ्ट 4 या 5 में उपयोग कर सकते हैं

    let date = Date()
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd H:mm:ss"
    let current_date_time = dateFormatter.string(from: date)
    print("before add time-->",current_date_time)

    //adding 5 miniuts
    let addminutes = date.addingTimeInterval(5*60)
    dateFormatter.dateFormat = "yyyy-MM-dd H:mm:ss"
    let after_add_time = dateFormatter.string(from: addminutes)
    print("after add time-->",after_add_time)

उत्पादन:

before add time--> 2020-02-18 10:38:15
after add time--> 2020-02-18 10:43:15

2

स्विफ्ट 3:

let minutes: TimeInterval = 1 * 60
let nowPlusOne = Date() + minutes

0

मामले में आप यूनिक्स टाइमस्टैम्प चाहते हैं

        let now : Date = Date()
        let currentCalendar : NSCalendar = Calendar.current as NSCalendar

        let nowPlusAddTime : Date = currentCalendar.date(byAdding: .second, value: accessTime, to: now, options: .matchNextTime)!

        let unixTime = nowPlusAddTime.timeIntervalSince1970

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.