वर्तमान तिथि से 7 दिन घटाएं


119

ऐसा लगता है कि मैं वर्तमान तिथि से 7 दिन घटा नहीं सकता। यह मैं कैसे कर रहा हूँ:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setDay:-7];
NSDate *sevenDaysAgo = [gregorian dateByAddingComponents:offsetComponents toDate:[NSDate date] options:0];

SevenDaysAgo को वर्तमान तिथि के समान मूल्य मिलता है।

कृपया मदद कीजिए।

संपादित करें: मेरे कोड में मैं उस चर को बदलना भूल गया, जिसे सही तारीख के साथ वर्तमान तिथि मिलती है। तो ऊपर कोड कार्यात्मक है।


3
[NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)]- हालांकि यह DST परिवर्तनों को नहीं संभालता है।
हॉट लक्स

वह काम करना चाहिए। यदि आप घटाना 7 के बजाय 1 जोड़ते हैं तो क्या यह काम करता है? आप यह कैसे निर्धारित करते हैं कि सातडेअगो आज को संदर्भित करता है?
जेरेमीपीप

जवाबों:


112

तारीख का उपयोग करें AddingTimeInterval विधि:

NSDate *now = [NSDate date];
NSDate *sevenDaysAgo = [now dateByAddingTimeInterval:-7*24*60*60];
NSLog(@"7 days ago: %@", sevenDaysAgo);

उत्पादन:

7 days ago: 2012-04-11 11:35:38 +0000

आशा करता हूँ की ये काम करेगा


45
ऐसे किनारे मामले हैं जहां यह ठीक से काम नहीं करेगा, उदाहरण के लिए यदि दिन की बचत प्रश्न में सात दिनों के दौरान बदल जाती है।
जेरेमीपीप

1
dymv का जवाब ऐसा करने का सुरक्षित तरीका है।
w3bshark

2
उपरोक्त कारणों से यह गलत उत्तर है, dymv के उत्तर का उपयोग करें
BarrettJ

1
वास्तव में यह बस द्वारा किया जा सकता है:[now dateByAddingDays:-7]
CrashOverride

इस तरह की गणना करना डेंजरस है, @ डो के संस्करण को प्राथमिकता दें।
16

196

कोड:

NSDate *currentDate = [NSDate date];
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setDay:-7];
NSDate *sevenDaysAgo = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:currentDate options:0];
NSLog(@"\ncurrentDate: %@\nseven days ago: %@", currentDate, sevenDaysAgo);
[dateComponents release];

उत्पादन:

currentDate: 2012-04-22 12:53:45 +0000
seven days ago: 2012-04-15 12:53:45 +0000

और मैं जेरेमीप से पूरी तरह सहमत हूं।

बी आर।
यूजीन


2
इस जवाब में एक स्मृति रिसाव है।
१५:४ra बजे अतुलजंगरा

133

यदि आप कम से कम iOS 8 या OS X 10.9 पर चल रहे हैं, तो एक समान क्लीनर तरीका है:

NSDate *sevenDaysAgo = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay
                                                                value:-7
                                                               toDate:[NSDate date]
                                                              options:0];

या, स्विफ्ट 2 के साथ:

let sevenDaysAgo = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -7,
    toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))

और स्विफ्ट 3 और ऊपर के साथ यह और भी अधिक कॉम्पैक्ट हो जाता है:

let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: Date())

3
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह आपके लिए सभी किनारे मामलों को संभालता है।
ज़िव्को बोगदानोव

@ZhivkoBogdanov मेरा उत्तर स्वीकृत उत्तर के कुछ वर्षों बाद आया है, और मुझे विश्वास नहीं है कि आप इस तथ्य के बाद अपने स्वीकृत उत्तर को बदल सकते हैं।
डोव

यह भविष्य के संदर्भ के लिए कुछ और से अधिक है।
झिवको बोगदानोव

56

स्विफ्ट 3

Calendar.current.date(byAdding: .day, value: -7, to: Date())

3
NSCalendar का उपयोग न करें, इसके बजाय कैलेंडर का उपयोग करें :)
जोनास

8

स्विफ्ट 4.2 - म्यूट (अपडेट) स्व

यहां एक और तरीका है कि मूल पोस्टर एक सप्ताह पहले मिल सकता है अगर उसके पास पहले से ही एक तारीख चर (अपडेट / खुद को बदलता है)।

extension Date {
    mutating func changeDays(by days: Int) {
        self = Calendar.current.date(byAdding: .day, value: days, to: self)!
    }
}

प्रयोग

var myDate = Date()       // Jan 08, 2019
myDate.changeDays(by: 7)  // Jan 15, 2019
myDate.changeDays(by: 7)  // Jan 22, 2019
myDate.changeDays(by: -1) // Jan 21, 2019

या

// Iterate through one week
for i in 1...7 {
    myDate.changeDays(by: i)
    // Do something
}

4

dymv का जवाब बहुत अच्छा है। यह आप स्विफ्ट में उपयोग कर सकते हैं

extension NSDate {    
    static func changeDaysBy(days : Int) -> NSDate {
        let currentDate = NSDate()
        let dateComponents = NSDateComponents()
        dateComponents.day = days
        return NSCalendar.currentCalendar().dateByAddingComponents(dateComponents, toDate: currentDate, options: NSCalendarOptions(rawValue: 0))!
    }
}

आप इसके साथ कॉल कर सकते हैं

NSDate.changeDaysBy(-7) // Date week earlier
NSDate.changeDaysBy(14) // Date in next two weeks

आशा है कि यह मदद करता है और dymv को thx


4

स्विफ्ट 4.2 आईओएस 11. एक्स बेबेक का समाधान, शुद्ध स्विफ्ट

extension Date {
  static func changeDaysBy(days : Int) -> Date {
    let currentDate = Date()
    var dateComponents = DateComponents()
    dateComponents.day = days
    return Calendar.current.date(byAdding: dateComponents, to: currentDate)!
  }
}

4

स्विफ्ट ऑपरेटर एक्सटेंशन:

extension Date {
    
    static func -(lhs: Date, rhs: Int) -> Date {
        return Calendar.current.date(byAdding: .day, value: -rhs, to: lhs)!
    }
}

प्रयोग

let today = Date()
let yesterday = today - 7

3

मूल स्वीकृत उत्तर का 3.0+ संस्करण स्विफ्ट

दिनांक ()। AddTimeInterval (-7 * 24 * 60 * 60)

हालाँकि, यह केवल पूर्ण मान का उपयोग करता है। कैलेंडर उत्तर का उपयोग करना ज्यादातर मामलों में अधिक उपयुक्त होता है।


-2

स्विफ्ट 3:

डो के जवाब के लिए एक संशोधन।

extension Date {

    func dateBeforeOrAfterFromToday(numberOfDays :Int?) -> Date {

        let resultDate = Calendar.current.date(byAdding: .day, value: numberOfDays!, to: Date())!
        return resultDate
    }
}

उपयोग:

let dateBefore =  Date().dateBeforeOrAfterFromToday(numberOfDays : -7)
let dateAfter = Date().dateBeforeOrAfterFromToday(numberOfDays : 7)
print ("dateBefore : \(dateBefore), dateAfter :\(dateAfter)")

1
numberOfDaysवैकल्पिक क्यों है और फिर बल-अलिखित है? क्या यह सिर्फ एक गैर-वैकल्पिक नहीं होना चाहिए Int?
डव।

स्विफ्ट फ़ंक्शन में वैकल्पिक मान रखने का इसका उचित तरीका है।
एजी

1
लेकिन numberOfDays वैकल्पिक क्यों है? क्या कोई समय है जब कोई इस विस्तार पद्धति को कॉल करेगा और जोड़ने या हटाने के लिए कई दिन नहीं देगा?
Dov

-3

स्विफ्ट 3.0 के लिए

यहाँ fucntion है, आप यहाँ उदाहरण के लिए किसी भी गिनती से दिन, महीने, दिन कम कर सकते हैं, मैंने वर्तमान प्रणाली की तारीख को 100 वर्ष घटा दिया है, आप इसे दिन के लिए कर सकते हैं, महीना भी काउंटर सेट करें और इसे स्टोर करें सरणी, आप कहीं भी इस सरणी कर सकते हैं तब func currentTime ()

 {

    let date = Date()
    let calendar = Calendar.current
    var year = calendar.component(.year, from: date)
    let month = calendar.component(.month, from: date)
    let  day = calendar.component(.day, from: date)
    let pastyear = year - 100
    var someInts = [Int]()
    printLog(msg: "\(day):\(month):\(year)" )

    for _ in pastyear...year        {
        year -= 1
                     print("\(year) ")
        someInts.append(year)
    }
          print(someInts)
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.