मैं NSDate में 1 दिन कैसे जोड़ूं?


320

मूल रूप से, जैसा कि शीर्षक कहता है। मैं सोच रहा हूं कि मैं 1 दिन कैसे जोड़ सकता हूं NSDate

तो अगर यह थे:

21st February 2011

यह बन जाएगा:

22nd February 2011

या अगर यह थे:

31st December 2011

यह बन जाएगा:

1st January 2012.

4
ध्यान दें कि एक एनएसडी डेट का प्रतिनिधित्व नहीं करता है, यह समय में एक बिंदु का प्रतिनिधित्व करता है। इसलिए इसमें एक समय के साथ-साथ एक तारीख भी शामिल है।
Rog

4
सहमत - आपको नीचे ज़ैक जर्मन के जवाब का उपयोग करना चाहिए। एप्पल की तारीख और समय प्रोग्रामिंग गाइड देखें
ऐश फुरो

नए (और छोटे) समाधान के लिए नीचे स्क्रॉल करें!
6

जवाबों:


711

स्विफ्ट 5.0:

var dayComponent    = DateComponents()
dayComponent.day    = 1 // For removing one day (yesterday): -1
let theCalendar     = Calendar.current
let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
print("nextDate : \(nextDate)")

उद्देश्य सी :

NSDateComponents *dayComponent = [[NSDateComponents alloc] init];
dayComponent.day = 1;

NSCalendar *theCalendar = [NSCalendar currentCalendar];
NSDate *nextDate = [theCalendar dateByAddingComponents:dayComponent toDate:[NSDate date] options:0];

NSLog(@"nextDate: %@ ...", nextDate);

यह आत्म-व्याख्यात्मक होना चाहिए।


19
किसी दिनांक से घटाने के लिए आप ऋणात्मक घटकों का भी उपयोग कर सकते हैं।
डेटाग्राम

58
चयनित उत्तर की तुलना में बहुत बेहतर समाधान
जस्टिन मीनर्स 16

19
एक दिन के मूल्य को सेकंड में जोड़ने के बजाय दिनांक घटकों का उपयोग करने के लिए +1।
अबिज़र्न

हाँ दिन की बचत के लिए अच्छा काम करता है। डीएसटी जांच के लिए टिप: अपने मैक पर तिथि और समय रीसेट करें और फिर अपने सिम्युलेटर को पुनरारंभ करें, यह तब आपके सिस्टम समय का पालन करेगा।
रॉब वैन डेन बर्ग

2
स्विफ्ट में आपको dateByAddingComponents कॉल के अंतिम पैरामीटर को बदलने की जरूरत हैNSCalendarOptions(rawValue: 0)
gfpacheco

270

IOS 8 के बाद से आप उपयोग कर सकते हैं NSCalendar.dateByAddingUnit

स्विफ्ट 1.x में उदाहरण:

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar()
    .dateByAddingUnit(
         .CalendarUnitDay, 
         value: 1, 
         toDate: today, 
         options: NSCalendarOptions(0)
    )

स्विफ्ट 2.0:

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar()
    .dateByAddingUnit(
        .Day, 
        value: 1, 
        toDate: today, 
        options: []
    )

स्विफ्ट 3.0:

let today = Date()
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: today)

5
क्या यह सिर्फ मेरे लिए है, या स्विफ्ट के लिए यह बहुत आसान नहीं होगा कि इसमें कुछ बनाया जाए date.add(.days, 1)? * जाता है और
quemeful

2
@ ज्वलनशील extension Date { func adding(_ component: Calendar.Component, _ value: Int) -> Date? { return Calendar.current.date(byAdding: component, value: value, to: self) } }उपयोगDate().adding(.day, 1) // "Jun 6, 2019 at 5:35 PM"
लियो डबस

82

स्विफ्ट 5 के लिए अपडेट किया गया

let today = Date()
let nextDate = Calendar.current.date(byAdding: .day, value: 1, to: today)

उद्देश्य सी

 NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
 // now build a NSDate object for the next day
 NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
 [offsetComponents setDay:1];
 NSDate *nextDate = [gregorian dateByAddingComponents:offsetComponents toDate: [NSDate date] options:0];

34

iOS 8+, OSX 10.9+, ऑब्जेक्टिव-सी

NSCalendar *cal = [NSCalendar currentCalendar];    
NSDate *tomorrow = [cal dateByAddingUnit:NSCalendarUnitDay 
                                   value:1 
                                  toDate:[NSDate date] 
                                 options:0];

ध्यान दें कि आप यहां इकाई का उपयोग नहीं कर सकते (केवल एक का उपयोग करें)।
कटानोर

31

एक काम कर स्विफ्ट 3+ कार्यान्वयन के आधार पर highmaintenance के जवाब और vikingosegundo की टिप्पणी। इस तिथि विस्तार में वर्ष, माह और समय बदलने के अतिरिक्त विकल्प भी हैं:

extension Date {

    /// Returns a Date with the specified amount of components added to the one it is called with
    func add(years: Int = 0, months: Int = 0, days: Int = 0, hours: Int = 0, minutes: Int = 0, seconds: Int = 0) -> Date? {
        let components = DateComponents(year: years, month: months, day: days, hour: hours, minute: minutes, second: seconds)
        return Calendar.current.date(byAdding: components, to: self)
    }

    /// Returns a Date with the specified amount of components subtracted from the one it is called with
    func subtract(years: Int = 0, months: Int = 0, days: Int = 0, hours: Int = 0, minutes: Int = 0, seconds: Int = 0) -> Date? {
        return add(years: -years, months: -months, days: -days, hours: -hours, minutes: -minutes, seconds: -seconds)
    }

}

केवल ओपी द्वारा पूछे गए दिन को जोड़ने के लिए उपयोग तब होगा:

let today = Date() // date is then today for this example
let tomorrow = today.add(days: 1)

2
आप दिनांक घटकों का उपयोग करके कोड को बड़े पैमाने पर छोटा कर सकते हैं।
vikingosegundo

आप सही हैं, हालाँकि मेरे विचार में यह नीचे है: - एक्सटेंशन का उपयोग करने वाला कोड साफ नहीं दिखता है - यह घटकों के साथ कुछ अनावश्यक विकल्पों को खोलता है जो बहुत कम समझ में आता है जैसे let foo = Date().add([.calendar: 1, .yearForWeekOfYear: 3] मैं अपने उत्तर के लिए वैकल्पिक समाधान जोड़ रहा हूं । आपके सुझाव के लिए धन्यवाद, @vikingosegundo!
बेन्नो क्रेस

3
ठीक है, मेरा वास्तव में कुछ अलग मतलब है: gist.github.com/vikingosegundo/31ddb14920415ef444a9ab550411d4ff
vikingosegundo

22

स्विफ्ट 4.0 (स्विफ्ट 3.0 के रूप में इस अद्भुत जवाब में सिर्फ मेरे जैसे बदमाशों के लिए यह स्पष्ट कर रहा है)

let today = Date()
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: today)

3
क्या आप अपना परिवर्तनशील नाम बदलना भूल गए?
राकेश शास्त्री

13

नीचे दिए गए फ़ंक्शन का उपयोग करें और दिनांक दिनों / दिनों को प्राप्त करने के लिए दिनों के पैरामाटर का उपयोग करें। इसके बाद भविष्य की तारीख के लिए सकारात्मक या पिछली तारीखों के लिए नकारात्मक के रूप में पैरामीटर पास करें:

+ (NSDate *) getDate:(NSDate *)fromDate daysAhead:(NSUInteger)days
{
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    dateComponents.day = days;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *previousDate = [calendar dateByAddingComponents:dateComponents
                                                     toDate:fromDate
                                                    options:0];
    [dateComponents release];
    return previousDate;
}

10

स्विफ्ट में

var dayComponenet = NSDateComponents()
dayComponenet.day = 1

var theCalendar = NSCalendar.currentCalendar()
var nextDate = theCalendar.dateByAddingComponents(dayComponenet, toDate: NSDate(), options: nil)

8

यही काम है!

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSCalendarUnit unit = NSCalendarUnitDay;
    NSInteger value = 1;
    NSDate *today = [NSDate date];
    NSDate *tomorrow = [calendar dateByAddingUnit:unit value:value toDate:today options:NSCalendarMatchStrictly];

जाहिर है यह सवाल कोड डंप स्वर्ग है। तो आप बाहर एकल करने के लिए कोई कारण नहीं।
ड्रू

2
मेरा उत्तर अधिक सही है क्योंकि यदि आप NSCalendarWrapCompords (0) विकल्प का उपयोग करते हैं तो आप केवल चालू माह की सीमा में दिनांक बना सकते हैं। इसका मतलब है कि यदि आप जनवरी, 31 2016 को NSCalendarWrapCompords के साथ 1 दिन जोड़ते हैं, तो आपको जनवरी, 1 2016 मिलेगा। NSCalendarMatchStrictly विकल्प के साथ आपको अगले कैलेंडर की तारीख मिलेगी।
डेन्झुकोव

8

स्विफ्ट 3.0 बहुत सरल कार्यान्वयन होगा:

func dateByAddingDays(inDays: Int) -> Date {
    let today = Date()
    return Calendar.current.date(byAdding: .day, value: inDays, to: today)!
}

5
NSDate *today=[NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *components=[[NSDateComponents alloc] init];
components.day=1;
NSDate *targetDate =[calendar dateByAddingComponents:components toDate:today options: 0];

5

स्विफ्ट 4.0

extension Date {
    func add(_ unit: Calendar.Component, value: Int) -> Date? {
        return Calendar.current.date(byAdding: unit, value: value, to: self)
    }
}

प्रयोग

date.add(.day, 3)!   // adds 3 days
date.add(.day, -14)!   // subtracts 14 days

नोट: यदि आपको पता नहीं है कि एक विस्मयादिबोधक बिंदु के साथ कोड की रेखाएं समाप्त क्यों होती हैं, तो Google पर "स्विफ्ट ऑप्शनल" देखें।


3

आप NSDate की विधि का उपयोग कर सकते हैं - (id)dateByAddingTimeInterval:(NSTimeInterval)secondsजहां secondsहोगा60 * 60 * 24 = 86400


3
NSDate के addByTimeInterval को iOS 4 ( bit.ly/vtOzvU ) में चित्रित किया गया था । इसके बजाय dateByAddingTimeInterval ( bit.ly/vRkFrN ) का उपयोग करें।
बिलमाया

4
दिन के समय की बचत के कारण दिन 23, 24 या 25 घंटे हो सकते हैं।
vikingosegundo

3

स्विफ्ट 2.1.1 और xcode 7.1 OSX 10.10.5 में, आप फ़ंक्शन का उपयोग करके किसी भी दिन आगे और पीछे जोड़ सकते हैं

func addDaystoGivenDate(baseDate:NSDate,NumberOfDaysToAdd:Int)->NSDate
{
    let dateComponents = NSDateComponents()
    let CurrentCalendar = NSCalendar.currentCalendar()
    let CalendarOption = NSCalendarOptions()

    dateComponents.day = NumberOfDaysToAdd

    let newDate = CurrentCalendar.dateByAddingComponents(dateComponents, toDate: baseDate, options: CalendarOption)
    return newDate!
}

9 दिनों की वर्तमान तिथि बढ़ाने के लिए फ़ंक्शन कॉल

var newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: 9)
print(newDate)

80 दिनों से वर्तमान तिथि में वृद्धि के लिए फ़ंक्शन कॉल

newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: -80)
 print(newDate)

3

यहां एक सामान्य उद्देश्य विधि है जो आपको निर्दिष्ट तिथि में किसी भी प्रकार की इकाई (वर्ष / महीना / दिन / घंटा / दूसरा आदि) को जोड़ने / घटाने देती है।

स्विफ्ट का उपयोग करना 2.2

func addUnitToDate(unitType: NSCalendarUnit, number: Int, date:NSDate) -> NSDate {

    return NSCalendar.currentCalendar().dateByAddingUnit(
        unitType,
        value: number,
        toDate: date,
        options: NSCalendarOptions(rawValue: 0))!

}

print( addUnitToDate(.Day, number: 1, date: NSDate()) ) // Adds 1 Day To Current Date
print( addUnitToDate(.Hour, number: 1, date: NSDate()) ) // Adds 1 Hour To Current Date
print( addUnitToDate(.Minute, number: 1, date: NSDate()) ) // Adds 1 Minute To Current Date

// NOTE: You can use negative values to get backward values too

3
NSDateComponents *dayComponent = [[[NSDateComponents alloc] init] autorelease];
dayComponent.day = 1;

NSCalendar *theCalendar = [NSCalendar currentCalendar];
dateToBeIncremented = [theCalendar dateByAddingComponents:dayComponent toDate:dateToBeIncremented options:0];

ठीक है - मैंने सोचा कि यह मेरे लिए काम करने वाला था। हालाँकि, यदि आप इसे 31 मार्च 2013 को एक दिन जोड़ने के लिए उपयोग करते हैं, तो यह एक तारीख वापस कर देगा जिसमें केवल 23 घंटे जोड़े गए हैं। यह वास्तव में 24 हो सकता है, लेकिन गणना में उपयोग केवल 23:00 घंटे जोड़ा गया है।

इसी तरह, यदि आप 28 अक्टूबर 2013 को आगे बढ़ते हैं, तो कोड 25 घंटे जोड़ता है जिसके परिणामस्वरूप 2013-10-28 01:00:00 की तारीख का समय होता है।

एक दिन जोड़ने के लिए मैं शीर्ष पर बात कर रहा था:

NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

जटिल, मुख्यतः दिन के उजाले की बचत के कारण।


वर्ष में एक बार दिन में सिर्फ 23 घंटे होते हैं। एक बार 25. और हर कुछ वर्षों 60*60*24 + 1में लीप सेकंड के कारण इसकी लंबाई होती है । तारीखों को इस सब को कवर करना चाहिए, और यही कारण है कि कोको की तारीख से निपटने वास्तव में बहुत अच्छा है!
vikingosegundo

2
NSDate *now = [NSDate date];
int daysToAdd = 1;
NSDate *tomorrowDate = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEEE, dd MMM yyyy"];
NSLog(@"%@", [dateFormatter stringFromDate:tomorrowDate]);

2

स्विफ्ट में आप NSDate में विधि जोड़ने के लिए एक्सटेंशन बना सकते हैं

extension NSDate {
    func addNoOfDays(noOfDays:Int) -> NSDate! {
        let cal:NSCalendar = NSCalendar.currentCalendar()
        cal.timeZone = NSTimeZone(abbreviation: "UTC")!
        let comps:NSDateComponents = NSDateComponents()
        comps.day = noOfDays
        return cal.dateByAddingComponents(comps, toDate: self, options: nil)
    }
}

आप इस रूप में उपयोग कर सकते हैं

NSDate().addNoOfDays(3)

2

स्विफ्ट 4 के लिए अपडेट:

let now = Date() // the current date/time
let oneDayFromNow = Calendar.current.date(byAdding: .day, value: 1, to: now) // Tomorrow with same time of day as now

1

स्विफ्ट 2.2 के लिए:

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar().dateByAddingUnit(
        .Day,
        value: 1,
        toDate: today,
        options: NSCalendarOptions.MatchStrictly)

आशा है कि यह किसी की मदद करता है!


1

स्विफ्ट 4, यदि आपको वास्तव में 24 घंटे की शिफ्ट (60 * 60 * 24 सेकंड) की आवश्यकता है, न कि "1 कैलेंडर डे"

भविष्य: let dayAhead = Date(timeIntervalSinceNow: TimeInterval(86400.0))

विगत: let dayAgo = Date(timeIntervalSinceNow: TimeInterval(-86400.0))


1

स्विफ्ट 5 के लिए अद्यतन

let nextDate = fromDate.addingTimeInterval(60*60*24)

0
NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
NSDate *startDate = [calendar dateFromComponents:components];
NSLog(@"StartDate = %@", startDate);

components.day += 1;
NSDate *endDate = [calendar dateFromComponents:components];
NSLog(@"EndDate = %@", endDate);

0

मुझे भी यही समस्या थी; NSDate के लिए एक्सटेंशन का उपयोग करें:

- (id)dateByAddingYears:(NSUInteger)years
                 months:(NSUInteger)months
                   days:(NSUInteger)days
                  hours:(NSUInteger)hours
                minutes:(NSUInteger)minutes
                seconds:(NSUInteger)seconds
{
    NSDateComponents * delta = [[[NSDateComponents alloc] init] autorelease];
    NSCalendar * gregorian = [[[NSCalendar alloc]
                               initWithCalendarIdentifier:NSCalendarIdentifierGregorian] autorelease];

    [delta setYear:years];
    [delta setMonth:months];
    [delta setDay:days];
    [delta setHour:hours];
    [delta setMinute:minutes];
    [delta setSecond:seconds];

    return [gregorian dateByAddingComponents:delta toDate:self options:0];
}


0

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

    let date = Date()
    let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: date)
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let yesterday_date = dateFormatter.string(from: yesterday!)
    print("yesterday->",yesterday_date)

उत्पादन:

Current date: 2020-03-02
yesterday date: 2020-03-01

0

स्ट्रिंग एक्सटेंशन: स्ट्रिंग String_Date> दिनांक परिवर्तित करें

extension String{
  func DateConvert(oldFormat:String)->Date{ // format example: yyyy-MM-dd HH:mm:ss 
    let isoDate = self
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
    dateFormatter.dateFormat = oldFormat
    return dateFormatter.date(from:isoDate)!
  }
}

दिनांक विस्तार: दिनांक परिवर्तित करें > स्ट्रिंग

extension Date{
 func DateConvert(_ newFormat:String)-> String{
    let formatter = DateFormatter()
    formatter.dateFormat = newFormat
    return formatter.string(from: self)
 }
}

तिथि विस्तार: प्राप्त +/- दिनांक

extension String{
  func next(day:Int)->Date{
    var dayComponent    = DateComponents()
    dayComponent.day    = day
    let theCalendar     = Calendar.current
    let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
    return nextDate!
  }

 func past(day:Int)->Date{
    var pastCount = day
    if(pastCount>0){
        pastCount = day * -1
    }
    var dayComponent    = DateComponents()
    dayComponent.day    = pastCount
    let theCalendar     = Calendar.current
    let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
    return nextDate!
 }
}

उपयोग:

let today = Date()
let todayString = "2020-02-02 23:00:00"
let newDate = today.DateConvert("yyyy-MM-dd HH:mm:ss") //2020-02-02 23:00:00
let newToday = todayString.DateConvert(oldFormat: "yyyy-MM-dd HH:mm:ss")//2020-02-02
let newDatePlus = today.next(day: 1)//2020-02-03 23:00:00
let newDateMinus = today.past(day: 1)//2020-02-01 23:00:00

संदर्भ: एकाधिक प्रश्न से
मैं एक एनएसडीटी में 1 दिन कैसे जोड़ सकता हूं?
गणित का कार्य सकारात्मक int को ऋणात्मक और ऋणात्मक को धनात्मक में परिवर्तित करना है?
NSString को NSDate में परिवर्तित करना (और फिर से वापस)


-1

निम्नलिखित कोड का उपयोग करें:

NSDate *now = [NSDate date];
int daysToAdd = 1;
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

जैसा

addTimeInterval

अब पदावनत हो गया है।


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