2015-07-31 6 views
7

के लिए सप्ताह के अगले निकटतम विशिष्ट दिन के लिए एनएसडीएटी खोजें मान लीजिए कि आज बुधवार है। मैं को NSDateComponents में तोड़ सकता हूं, लेकिन मुझे अगले आगामी सोमवार को NSDate खोजने की आवश्यकता है। अगर आज सोमवार है, तो अगले आगामी सोमवार आज है। इसे हासिल करने का सही तरीका क्या है?किसी भी दिनांक

+0

का उपयोग कर सकते हैं आप https://github.com/mysterioustrousers/MTDates, और इसमें एक 'mt_startOfNextWeek;' विधि है। –

+0

मुझे किसी तीसरे भाग पुस्तकालयों के बिना समाधान की आवश्यकता है –

+2

क्या आपका अगला * आगामी * सोमवार, या सिर्फ * निकटतम * (जो अतीत में या भविष्य में हो सकता है) का मतलब है? –

उत्तर

20

आप NSCalendar वस्तु पर nextDateAfterDate: विधि का उपयोग कर सकते हैं इस लक्ष्य को हासिल करने के लिए,

let now = Date() // today 

var matchingComponents = DateComponents() 
matchingComponents.weekday = 2 // Monday 

let comingMonday = Calendar.current.nextDate(after: now, 
               matching: matchingComponents, 
               matchingPolicy:.nextTime) 

यहां, अगले सोमवार को खोजने का एक आसान तरीका है। अगर आज सोमवार है तो निम्नलिखित कार्य आज या फिर निकटतम अगले सोमवार को लौटाता है। ध्यान दें कि यह en_POSIX_US का उपयोग करता है जैसे कि दिन मिलान किया जा सकता है। जब वातावरण en_POSIX_US है, काम करने के दिन प्रतीक बन,

["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] 

और, यहाँ कैसे इस दिन इस्तेमाल किया जा सकता है,

func findNext(_ day: String, afterDate date: Date) -> Date? { 

    var calendar = Calendar.current 
    calendar.locale = Locale(identifier: "en_US_POSIX") 

    let weekDaySymbols = calendar.weekdaySymbols 
    let indexOfDay = weekDaySymbols.index(of: day) 

    assert(indexOfDay != nil, "day passed should be one of \(weekDaySymbols), invalid day: \(day)") 

    let weekDay = indexOfDay! + 1 

    let components = calendar.component(.weekday, from: date) 

    if components == weekDay { 
     return date 
    } 

    var matchingComponents = DateComponents() 
    matchingComponents.weekday = weekDay // Monday 

    let nextDay = calendar.nextDate(after: date, 
            matching: matchingComponents, 
            matchingPolicy:.nextTime) 
    return nextDay! 
} 


let nextMonday = findNext("Monday", afterDate: Date()) 
let mondayAfterThat = findNext("Monday", afterDate: nextMonday!) 

let thursday = findNext("Thursday", afterDate: mondayAfterThat!) 
+0

के लिए धन्यवाद यह मुझे लगता है कि यह सबसे अच्छा समाधान है :) –

+2

यह आश्चर्यजनक है कि 'एनएससीएंडेंडर' के आईओएस 8 विधियां अभी भी संदर्भ पुस्तकालय पर अनियंत्रित हैं । – Desdenova

+0

हां, ऐसा लगता है कि उन्होंने एनएससीएंडर और भाई बहनों को कई नए एपिस जोड़े हैं। उन्हें दस्तावेज करना वास्तव में अच्छा होगा। – Sandeep

-4

आप NSDateComponents का उपयोग करके सप्ताह दिन हो और अंतराल दिनों की गणना कर सकते, तो जैसे NSDate से dateByAddingTimeInterval का उपयोग करें:

let now = NSDate() 
let calendar: NSDateComponents = NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitWeekday, fromDate: now) 
let weekday = calendar.weekday // 1 = Sunday, 2 = Monday 

// You get input the weekday here and calculate the interval 

// exmaple for moving to the next day 
let expectedDate = now.dateByAddingTimeInterval(1 * 24 * 60 * 60) 

// exmaple for moving to yesterday 
let yesterday = now.dateByAddingTimeInterval(-1 * 24 * 60 * 60) 
+1

** ** दिन की अवधि के रूप में 24 * 60 * 60 सेकंड का उपयोग न करें (डेलाइट सेविंग टाइम ट्रांज़िशन के बारे में सोचें)। –

+0

@MartinR क्षमा करें। मैं पालन नहीं करता हूं। क्या आप इसे फिर से समझा सकते हैं? –

+0

दिन 23, 24, 25 घंटे लंबे हो सकते हैं, डेलाइट सेविंग टाइम्स – vikingosegundo

2
लक्ष्य के लिए

आईओएस> = 8 उपयोग GeneratorOfOne के समाधान

अन्यथा आप इस

let now = NSDate() 
var lastMonday:NSDate? 
var nextMonday:NSDate? 
var start:NSDate?   

var interval:NSTimeInterval = 0 // holds the length of a week. can differ for Daylight Saving Time 
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! // have a own calendar object for this calculation to guarantee that the next line does not influence other calculations 
cal.firstWeekday = 2    // make sure first day of week is Monday. 


cal.rangeOfUnit(NSCalendarUnit.CalendarUnitWeekOfMonth, startDate: &lastMonday, interval:&interval, forDate: now)  // monday of current week 
nextMonday = lastMonday?.dateByAddingTimeInterval(interval) // add a weeks length to the last weeks's monday 
println(nextMonday) 
संबंधित मुद्दे