मैं दो तिथियों के बीच अंतर की गणना कैसे कर सकता हूं?


जवाबों:


237
NSDate *date1 = [NSDate dateWithString:@"2010-01-01 00:00:00 +0000"];
NSDate *date2 = [NSDate dateWithString:@"2010-02-03 00:00:00 +0000"];

NSTimeInterval secondsBetween = [date2 timeIntervalSinceDate:date1];

int numberOfDays = secondsBetween / 86400;

NSLog(@"There are %d days in between the two dates.", numberOfDays);

संपादित करें:

याद रखें, NSDateऑब्जेक्ट समय के सटीक क्षणों का प्रतिनिधित्व करते हैं, उनके पास कोई संबंधित समय-क्षेत्र जानकारी नहीं है। जब आप उदाहरण के लिए स्ट्रिंग को किसी दिनांक NSDateFormatterमें NSDateFormatterकनवर्ट करते हैं , उदाहरण के लिए , कॉन्फ़िगर किए गए टाइमज़ोन से समय को परिवर्तित करता है। इसलिए, दो NSDateऑब्जेक्ट्स के बीच सेकंड की संख्या हमेशा समय-क्षेत्र-अज्ञेयवादी होगी।

इसके अलावा, यह प्रलेखन निर्दिष्ट करता है कि कोको के समय का कार्यान्वयन लीप सेकंड के लिए जिम्मेदार नहीं है, इसलिए यदि आपको ऐसी सटीकता की आवश्यकता है, तो आपको अपने स्वयं के कार्यान्वयन की आवश्यकता होगी।


5
@RalucaGurau: 86400 एक दिन में सेकंड की संख्या है (यानी 60 सेकंड, 60 मिनट, कई बार 10 मिनट)। महीने के साथ इसका कोई लेना-देना नहीं है।
dreamlax

18
सभी दिनों में 86400 सेकंड नहीं होते हैं। एक तुच्छ उदाहरण के लिए यह ठीक है लेकिन वास्तविक दुनिया में यह एक अच्छा विचार नहीं है। डीएसटी परिवर्तन, लीप सेकंड आदि इसके साथ सभी गड़बड़ कर सकते हैं। NSCalendar आपको बता सकता है कि किसी दिए गए दिन में कितने सेकंड हैं।
नीलिन्ग्लिस

2
@ मुथुकुमार: आईओएस पर नहीं, यह विधि केवल मैक ओएस एक्स पर उपलब्ध है। यह सवाल टैग किया गया है cocoaऔर cocoa-touchइसलिए यह जवाब केवल मैक ओएस एक्स पर ही लागू होता है।
ड्रीमलैक्स

1
समय में किसी भी दो क्षणों के बीच दिनों की संख्या हमेशा 86400 होगी। क्या मनुष्य सामान्य से एक घंटे पहले जागने के लिए खुद को बेवकूफ बनाने के चरण में है या नहीं, इस तथ्य से कोई फर्क नहीं पड़ता है कि एक दिन 86400 सेकंड लंबा है (लीप को अनदेखा करते हुए) सेकंड्स)
ड्रीमलैक्स

1
बस यह जोड़ना चाहते हैं कि यदि आपके पास अंत में उस +0000 नहीं है, तो आपको हमेशा के लिए शून्य तिथियां और 0 का मान अलग-अलग मिलेगा, चाहे वह कोई भी हो। तो, उस जाल में मत पड़ो।
वोलोमाइक

84

आप कुछ इस तरह का उपयोग करना चाहते हैं:

NSDateComponents *components;
NSInteger days;

components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit 
        fromDate: startDate toDate: endDate options: 0];
days = [components day];

मेरा मानना ​​है कि यह विधि उन स्थितियों के लिए जिम्मेदार है जैसे कि दिन की बचत में परिवर्तन।


2
क्या दी गई तारीखों के समय को अनदेखा करने का एक सरल तरीका है?
मिहाई तिमार

तदनुसार अन्य कैलेंडर इकाइयों के लिए बदला जा सकता है :) वर्ष इकाई के लिए उपयोग किया जाता है।
टेक प्रेमी

NSDateऑब्जेक्ट पहले से ही समय-क्षेत्र अज्ञेयवादी हैं। समय-क्षेत्र की जानकारी को निकाल दिया जाता है जब उदाहरण के साथ तारीखें डालते हैं NSDateFormatter, ताकि NSDateसमय में ऑब्जेक्ट सटीक क्षणों का प्रतिनिधित्व करें। इसलिए, यदि आपके पास पहले से ही है startDateऔर endDate, ये दोनों वस्तुएं अलग-अलग सेकंड की x संख्या होंगी । टाइम-ज़ोन का इससे कोई लेना-देना नहीं होगा।
ड्रीमलैक्स

@ बैंजामिन: आप ऐसा क्यों कहते हैं?
ड्रीमलैक्स

ड्रीमलैक्स, आपका उत्तर गलत है। सादा और सरल। 12 जनवरी दोपहर 1 मानक समय और 12 अप्रैल दोपहर 1 दिन के समय के बीच दिनों की संख्या की गणना करें, और आपका सूत्र काम नहीं करता है। यह एक आलसी सूत्र है और डेवलपर्स को इसकी गणना करने के लिए NSDateCompords ऑब्जेक्ट का उपयोग करना चाहिए।
रिकस्टर

25
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds

कहाँ हैं date1और date2हैं NSDate

इसके अलावा, इसकी परिभाषा पर ध्यान दें NSTimeInterval:

typedef double NSTimeInterval;

ध्यान दें कि NSTimeInterval वास्तव में एक दोहरा है, इसलिए आप इसे किसी अन्य संख्या की तरह उपयोग कर सकते हैं।
केंडल हेल्मसटेटर गेलनर

19

इसे चेकआउट करें। यह दिन के उजाले की बचत का ख्याल रखता है, यह गणना करने के लिए आईओएस कैलेंडर का उपयोग करता है। आप घंटों और दिनों के साथ मिनटों को शामिल करने के लिए स्ट्रिंग और स्थितियों को बदल सकते हैं।

+(NSString*)remaningTime:(NSDate*)startDate endDate:(NSDate*)endDate
{
    NSDateComponents *components;
    NSInteger days;
    NSInteger hour;
    NSInteger minutes;
    NSString *durationString;

    components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute fromDate: startDate toDate: endDate options: 0];

    days = [components day];
    hour = [components hour];
    minutes = [components minute];

    if(days>0)
    {
        if(days>1)
            durationString=[NSString stringWithFormat:@"%d days",days];
        else
            durationString=[NSString stringWithFormat:@"%d day",days];
        return durationString;
    }
    if(hour>0)
    {        
        if(hour>1)
            durationString=[NSString stringWithFormat:@"%d hours",hour];
        else
            durationString=[NSString stringWithFormat:@"%d hour",hour];
        return durationString;
    }
    if(minutes>0)
    {
        if(minutes>1)
            durationString = [NSString stringWithFormat:@"%d minutes",minutes];
        else
            durationString = [NSString stringWithFormat:@"%d minute",minutes];

        return durationString;
    }
    return @""; 
}

यह विधि समय के अंतर की गणना करने का सही तरीका है।
मोक्षार्थ

बस अगर आप शर्तों के साथ उन सभी के साथ अन्य रख सकते हैं। अन्यथा आपको दिखाए गए समय का केवल एक प्रारूप मिलेगा।
मोक्षार्थ

3

स्विफ्ट 5 और आईओएस 12 के साथ, अपनी आवश्यकताओं के अनुसार, आप दिनों में दो तिथियों के बीच अंतर खोजने के लिए निम्नलिखित दो तरीकों में से एक का उपयोग कर सकते हैं।


# 1। का उपयोग करते हुए Calendarकी dateComponents(_:from:to:)विधि

import Foundation

let calendar = Calendar.current

let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!

let dateComponents = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)

print(dateComponents) // prints: day: 1621 isLeapMonth: false
print(String(describing: dateComponents.day)) // prints: Optional(1621)

# 2। का उपयोग करते हुए DateComponentsFormatterकी string(from:to:)विधि

import Foundation

let calendar = Calendar.current

let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [NSCalendar.Unit.day]

let elapsedTime = formatter.string(from: startDate, to: endDate)
print(String(describing: elapsedTime)) // prints: Optional("1,621 days")

1

स्विफ्ट 4 इसे
आज़माएं और देखें (स्ट्रिंग के साथ दिनांक सीमा):

// Start & End date string
let startingAt = "01/01/2018"
let endingAt = "08/03/2018"

// Sample date formatter
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"

// start and end date object from string dates
var startDate = dateFormatter.date(from: startingAt) ?? Date()
let endDate = dateFormatter.date(from: endingAt) ?? Date()


// Actual operational logic
var dateRange: [String] = []
while startDate <= endDate {
    let stringDate = dateFormatter.string(from: startDate)
    startDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate) ?? Date()
    dateRange.append(stringDate)
}

print("Resulting Array - \(dateRange)")

स्विफ्ट 3

var date1 = Date(string: "2010-01-01 00:00:00 +0000")
var date2 = Date(string: "2010-02-03 00:00:00 +0000")
var secondsBetween: TimeInterval = date2.timeIntervalSince(date1)
var numberOfDays: Int = secondsBetween / 86400
print(numberOfDays)

सभी दिनों में सेकंड की मात्रा नहीं होती है।
पावन

@Pavan - इस उत्तर को अपडेट करके अपने इनपुट्स को साझा करने और इसे बेहतर बनाने के लिए आपका स्वागत है।
Krunal

इसे बेहतर बनाने के लिए मुझे आपके पूरे उत्तर को पुनः लिखने की आवश्यकता होगी, जिस स्थिति में इसे हटाया भी जा सकता है क्योंकि यह वही समाधान होगा जिसके ऊपर दिए गए उत्तर में हार्डकोड के मानों का उपयोग नहीं किया गया है
Pavan

0

आप तारीखों को सेकंडों में परिवर्तित करके अंतर खोज सकते हैं और इसके लिए 1970 से समय अंतराल ले सकते हैं और फिर आप दो तिथियों के बीच अंतर पा सकते हैं।


जब दो तिथियों की गणना एक-दूसरे के साथ सीधे की जा सकती है (एक ही समय के डोमेन को मानते हुए)। क्या 1970 से पहले दोनों तिथियों की गणना करने और फिर अंतर खोजने का कोई विशेष कारण है?
आदिल

0

अंतर खोजने के लिए, आपको भविष्य में वर्तमान तिथि और तारीख प्राप्त करने की आवश्यकता है। निम्नलिखित मामले में, मैंने भविष्य की तारीख के उदाहरण के लिए 2 दिनों का उपयोग किया। इनके द्वारा गणना:

2 days* 24 hours* 60 minutes* 60 seconds। हम 2 दिनों में सेकंड की संख्या 172,800 होने की उम्मीद करते हैं।

// Set the current and future date
let now = Date()
let nowPlus2Days = Date(timeInterval: 2*24*60*60, since: now)

// Get the number of seconds between these two dates
let secondsInterval = DateInterval(start: now, end: nowPlus2Days).duration

print(secondsInterval) // 172800.0

1
कृपया उत्तर के रूप में केवल कोड पोस्ट न करें, बल्कि यह भी बताएं कि आपका कोड क्या करता है और यह कैसे प्रश्न की समस्या को हल करता है। एक स्पष्टीकरण के साथ उत्तर आमतौर पर उच्च गुणवत्ता के होते हैं, और upvotes को आकर्षित करने की अधिक संभावना होती है।
मार्क रोटेवेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.