NSDate को वर्ष / माह / दिन मिलता है


291

NSDateकिसी अन्य जानकारी को दिए हुए मैं किसी वस्तु का वर्ष / महीना / दिन कैसे प्राप्त कर सकता हूं ? मुझे एहसास है कि मैं शायद इसके साथ कुछ ऐसा कर सकता हूं:

NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];

लेकिन ऐसा लगता है कि कुछ के लिए परेशानी का एक बहुत कुछ के रूप में सरल हो रहा है एक NSDateवर्ष / माह / दिन। क्या कोई और उपाय है?


4
जब तक मैंने "NSCalendar * cal = [[NSCalendar आवंटित] initWithCalendarIdentifier: NSGregorianCalendar];" यह प्रश्न पूछे जाने के बाद से एपीआई में बदलाव हुआ होगा।
रसेल थैकस्टन

@ Futureelite7 ने संशोधन के लिए वापस रोल किया। 1. कोड ऐतिहासिक उद्देश्यों के लिए है, और मेरा प्रारंभिक विचार क्या था, इसका एक सरल विवरण था।
रिचर्ड जे। रॉस III

कोड अब काम नहीं करता है। क्या आप सही कोड को नोट कर सकते हैं?
Futureelite7

@ futureelite7 सं। यह कोड मेरे पहले प्रयास का प्रदर्शन था, यह काम करने का कभी इरादा नहीं था। यदि आपको लगता है कि यह अस्पष्ट है, तो उस कोड ब्लॉक के आसपास के संदर्भ को संपादित करने के लिए स्वतंत्र महसूस करें, लेकिन कोड को स्वयं संपादित न करें। यदि आप स्वयं कोड को संपादित करने के बारे में बहुत दृढ़ता से महसूस करते हैं, तो कृपया इस कवर को मेटा में ले जाएं और हम देखेंगे कि अन्य मॉड्स का क्या कहना है।
रिचर्ड जे। रॉस III

8
@ मायिक यही कारण है कि आप उत्तर पढ़ते हैं, सवाल नहीं।
रिचर्ड जे। रॉस III

जवाबों:


615

क्योंकि यह जाहिरा तौर पर मेरा सबसे लोकप्रिय जवाब है, मैं इसे थोड़ा और अधिक जानकारी शामिल करने के लिए संपादित करने की कोशिश करूंगा।

अपने नाम के बावजूद, NSDateऔर अपने आप में मशीन समय में एक बिंदु को चिह्नित करता है, तारीख को नहीं। एक NSDateऔर एक वर्ष, महीने, या दिन द्वारा निर्दिष्ट समय के बीच कोई संबंध नहीं है। उसके लिए, आपको एक कैलेंडर देखना होगा। किसी भी समय दिया गया कोई भी बिंदु अलग-अलग तारीख की जानकारी आपको कैलेंडर के आधार पर देगा, जो आप देख रहे हैं (दिनांक ग्रेगोरियन और यहूदी कैलेंडर दोनों में समान नहीं हैं, उदाहरण के लिए), और जबकि ग्रेगोरियन कैलेंडर कैलेंडर में सबसे व्यापक रूप से उपयोग किया जाने वाला कैलेंडर है दुनिया - मैं मान रहा हूँ - हम थोड़े से पक्षपाती हैं कि NSDateइसे हमेशा इस्तेमाल करना चाहिए। NSDate, सौभाग्य से, कहीं अधिक द्विदलीय है।


NSCalendarजैसा कि आपने उल्लेख किया है, तारीख और समय गुजरता जा रहा है , लेकिन इसे करने का एक सरल तरीका है:

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];

यह NSDateComponentsवर्तमान दिन के लिए वर्तमान सिस्टम कैलेंडर से दिन, महीने और वर्ष युक्त ऑब्जेक्ट उत्पन्न करता है। ( ध्यान दें: यह वर्तमान उपयोगकर्ता-निर्दिष्ट कैलेंडर नहीं है, बस डिफ़ॉल्ट सिस्टम एक है।)

बेशक, यदि आप एक अलग कैलेंडर या दिनांक का उपयोग कर रहे हैं, तो आप इसे आसानी से बदल सकते हैं। उपलब्ध कैलेंडर और कैलेंडर इकाइयों की एक सूची NSCalendarकक्षा संदर्भ में पाई जा सकती है । के बारे में अधिक जानकारी कक्षा संदर्भNSDateComponents में पाई जा सकती है ।NSDateComponents


संदर्भ के लिए, व्यक्तिगत घटकों को एक्सेस NSDateComponentsकरना आसान नहीं है:

NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];

आपको बस दिमाग लगाना है: NSDateComponentsआपके द्वारा पूछे गए किसी भी क्षेत्र के लिए मान्य जानकारी नहीं होगी जब तक कि आपने उन्हें उस वैध जानकारी (यानी एस के NSCalendarसाथ उस जानकारी को प्रदान करने का अनुरोध NSCalendarUnit) के साथ उत्पन्न नहीं किया हो । NSDateComponentsअपने आप में कोई संदर्भ जानकारी नहीं है - वे सिर्फ सरल संरचनाएं हैं जो आपके उपयोग के लिए नंबर रखती हैं। यदि आप भी एक युग प्राप्त करना चाहते हैं, उदाहरण के लिए NSDateComponents, आपको ध्वज के NSCalendarसाथ जनरेटर विधि NSCalendarUnitEraखिलानी होगी।


3
इसके लिए एक सुधार, पहली पंक्ति में NSWekCalendarUnit के बजाय NSDayCalendarUnit होना चाहिए।
श्वेतवाचक

@ एरिक आप किस कैलेंडर का उपयोग कर रहे हैं? कोड?
इटाई फेरबर

7
@ जॉनी आपको मिलने वाले कैलेंडर के उपयोग पर निर्भर करता है। NSCalendar's +currentCalendarपद्धति सिस्टम कैलेंडर को लौटा देगी, और इसलिए यदि उपयोगकर्ता का फ़ोन जापानी या थाई समय मोड पर सेट है, तो आपको एक अलग वर्ष मिलेगा। यदि आप एक विशिष्ट कैलेंडर प्रणाली को बाध्य करना चाहते हैं, तो एक कैलेंडर बनाएं और इसे उचित स्थान के साथ आरंभ करें। उदाहरण के लिए, एक ग्रेगोरियन कैलेंडर को मजबूर करने के लिए, आप निम्नलिखित का उपयोग करना चाहेंगे:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
इटाई फेरर

2
enums NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit इसके बजाय NSCalendarUnitDay का उपयोग किया जाता है।
कुणाल बलानी

2
चेतावनी: जब तक आप उपयोगकर्ता को एक मूल्य दिखाने की कोशिश नहीं कर रहे हैं, तब तक [NSCalendar currentCalendar] का उपयोग न करें। विचार करें कि उपयोगकर्ता एक बौद्ध कैलेंडर का अनुसरण कर सकते हैं (वर्ष अब 2558 या कुछ और है), या किसी अन्य संख्या में विषम कैलेंडर। आप नहीं चाहते कि आपका ऐप इन मामलों में टूट जाए। जब तक आपके पास कोई विशेष कारण न हो, ग्रेगोरियन कैलेंडर का उपयोग करें। यह बग पकड़ना मुश्किल है क्योंकि आप और आपके परीक्षक सभी डिफॉल्ट रूप से ग्रेगोरियन का उपयोग कर सकते हैं।
n13

51

आप NSDateFormatter का उपयोग करके एक NSDate के अलग घटक प्राप्त कर सकते हैं:

NSDateFormatter *df = [[NSDateFormatter alloc] init];

[df setDateFormat:@"dd"];
myDayString = [df stringFromDate:[NSDate date]];

[df setDateFormat:@"MMM"];
myMonthString = [df stringFromDate:[NSDate date]];

[df setDateFormat:@"yy"];
myYearString = [df stringFromDate:[NSDate date]];

यदि आप संक्षिप्त नाम के बजाय महीने की संख्या प्राप्त करना चाहते हैं, तो "MM" का उपयोग करें। यदि आप पूर्णांक प्राप्त करना चाहते हैं, तो उपयोग करें[myDayString intValue];


1
इस जिस्ट के साथ उसका विस्तार किया । मज़े करो --- आप इसे अपने कोड में छोड़ सकते हैं।
डॉगएटडॉग

एक शब्दकोश में देखने के लिए तारीखों का उपयोग करने के लिए मेरी समस्या का हल :) धन्यवाद!
mlunoe

1
यह वास्तव में हर समय अपेक्षित रूप से 100% काम नहीं करता है। उदाहरण के लिए, यदि NSDate 2013-12-31 00:00:00 +0000 है, तो स्वरूपित दिनांक 2014 के लिए वर्ष में वापस आ जाएगी, भले ही दिनांक में वास्तविक संख्या 2013 हो।
margusholland

मैं वर्ष का दिन कैसे प्राप्त कर सकता हूं जैसे 10 अप्रैल वर्तमान दिन है वर्तमान वर्ष का 99 वां दिन है ?? -
iOS डेवलपर

17

बस इटाई के उत्कृष्ट (और काम करने वाले!) कोड को फिर से तैयार करने के लिए, यहां एक नमूना सहायक वर्ग की तरह दिखेगा, जो किसी दिए गए NSDate चर का वर्ष मान लौटाएगा ।

जैसा कि आप देख सकते हैं, इस कोड को महीने या दिन के लिए संशोधित करना काफी आसान है।

+(int)getYear:(NSDate*)date
{
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date];

    int year = [components year];
    int month = [components month];
    int day = [components day];

    return year;
}

(मुझे विश्वास नहीं हो रहा है कि हम 2013 में इस तरह से अपनी खुद की बुनियादी iOS दिनांक फ़ंक्शन लिख सकते हैं ...)

एक और बात: दो एनएसडी मूल्यों की तुलना करने के लिए कभी भी <और> का उपयोग न करें।

XCode ख़ुशी से इस तरह के कोड (बिना किसी त्रुटि या चेतावनी के) को स्वीकार करेगा, लेकिन इसके परिणाम एक लॉटरी हैं। आप चाहिए NSDates तुलना करने के लिए "की तुलना" समारोह का उपयोग करें:

if ([date1 compare:date2] == NSOrderedDescending) {
    // date1 is greater than date2        
}

4
सूचक तुलना के परिणाम एक लॉटरी से बहुत दूर हैं - उनके पास बहुत अच्छी तरह से परिभाषित परिणाम हैं, इसलिए जब तक आप उनका उपयोग उन उद्देश्यों के लिए करते हैं - बिंदुओं की तुलना करते हुए, वस्तुओं की नहीं।
रिचर्ड जे। रॉस III

यह एक लॉटरी नहीं हो सकती है, लेकिन C # की डेटटाइम कहीं अधिक सहज है। IOS में, कम-से-कम ऑपरेटर को वास्तव में दो NSDates की तुलना करनी चाहिए ... क्या कोई वास्तव में दो NSDate चर के संकेत की तुलना करना चाहेगा? बहुत कम से कम, एक्सकोड शो एक चेतावनी दिखाने के लिए पूछते हैं कि क्या यह वास्तव में उपयोगकर्ता वास्तव में क्या मतलब है।
माइक गिल्डहिल

1
यह सिर्फ एक आलसी कोडर का संकेत है जो उस भाषा के मूल सिद्धांतों को नहीं समझता है जिसे वह लिख रहा है। और, मेरे लिए ऐसी परिस्थितियां हैं, जहां ओबर्ज वस्तुओं के लिए सूचक तुलना आवश्यक है - खासकर यदि आप एक कस्टम कंटेनर बना रहे हैं (हालांकि चीजें एआरसी के साथ अजीब हो जाती हैं)।
रिचर्ड जे। रॉस III

1
मुझे एक आलसी कोडर होना चाहिए जो बुनियादी बातों को नहीं समझता है, लेकिन यह एक महान टिप माइक है!
पियर-ल्यूक गेंड्रेउ

4
सूचक तुलना आवश्यक हो सकती है लेकिन दो तारीखों की तुलना करते समय वे कम सामान्य उपयोग के मामले हैं। ९९.९९% किसी भी प्रोग्रामर को पॉइंटर्स की बजाय डेट्स की तुलना करने में ज्यादा दिलचस्पी होगी। मौलिक रूप से C # और .NET फ्रेमवर्क को सबसे आम परिदृश्यों को आसान बनाने के लिए डिज़ाइन किया गया था, इस प्रकार प्रोग्रामर को अधिक उत्पादक बनाते हैं, और कई मामलों में उद्देश्य-सी ऐसा लगता है कि यह जानबूझकर चीजों को अधिक कठिन बना देता है। अगर आपके पास हर भाषा की बुनियादी बातों पर 800 पेज की किताब पढ़ने का समय है, चीयर्स, लेकिन हममें से बाकी लोगों के पास समय पर और बजट के हिसाब से देने के लिए ऐप हैं।
क्रेक

16

स्विफ्ट 2.0 में:

    let date = NSDate()
    let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
    let components = calendar.components([.Month, .Day], fromDate: date)

    let (month, day) = (components.month, components.day)

11

मैं यह जवाब लिख रहा हूं क्योंकि यह एकमात्र तरीका है जो आपको NSDateComponentवैरिएबल से वापस वैकल्पिक नहीं देता है और / या उन वैरिएबल (स्विफ्ट 3 के लिए भी) को हटाने पर मजबूर करता है।

स्विफ्ट 3

let date = Date()
let cal = Calendar.current
let year = cal.component(.year, from: date)
let month = cal.component(.month, from: date)
let day = cal.component(.day, from: date)

स्विफ्ट 2

let date = NSDate()
let cal = NSCalendar.currentCalendar()
let year = cal.component(.Year, fromDate: date)
let month = cal.component(.Month, fromDate: date)
let day = cal.component(.Day, fromDate: date)

बोनस स्विफ्ट 3 मजेदार संस्करण

let date = Date()
let component = { (unit) in return Calendar.current().component(unit, from: date) }
let year = component(.year)
let month = component(.month)
let day = component(.day)

मैं वर्ष का दिन कैसे प्राप्त कर सकता हूं जैसे 10 अप्रैल वर्तमान दिन है वर्तमान वर्ष का 99 वां दिन है ?? -
iOS डेवलपर

और सुनिश्चित करें कि आप ग्रेगोरियन कैलेंडर का उपयोग करते हैं, उदाहरण के लिए जापानी कैलेंडर के लिए वर्ष घटक 1 अंक देता है ..
फ्लोवेट्टी

8

IOS 8 में नया

ObjC

NSDate *date = [NSDate date];
NSInteger era, year, month, day;
[[NSCalendar currentCalendar] getEra:&era year:&year month:&month day:&day fromDate:date];

तीव्र

let date = NSDate.init()
var era = 0, year = 0, month = 0, day = 0
NSCalendar.currentCalendar().getEra(&era, year:&year, month:&month, day:&day, fromDate: date)

2
गजब का! @ युकेन झोंग
लिटो

1
प्रतिभाशाली ! बेहतर सिंटेक्स!
जौन

4

यदि आप iOS 8+ को लक्षित कर रहे हैं, तो आप NSCalendarइसे और अधिक प्रभावी स्वरूप में प्राप्त करने के लिए नई सुविधा विधियों का उपयोग कर सकते हैं ।

पहले एक बनाएँ NSCalendarऔर जो भी NSDateआवश्यक हो उसका उपयोग करें ।

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];

आप व्यक्तिगत रूप से घटकों को निकाल सकते हैं component:fromDate:

NSInteger year = [calendar component:NSCalendarUnitYear fromDate:date];
NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date];
NSInteger day = [calendar component:NSCalendarUnitDay fromDate:date];

या, और भी अधिक संक्षेप में, के NSIntegerमाध्यम से संकेत का उपयोग करेंgetEra:year:month:day:fromDate:

NSInteger year, month, day;
[calendar getEra:nil year:&year month:&month day:&day fromDate:date];

अधिक जानकारी और उदाहरणों के लिए iOS 8 में NSDate मैनीपुलेशन मेड ईज़ी की जाँच करें । डिस्क्लेमर, मैंने पोस्ट लिखी।


मैं वर्ष का दिन कैसे प्राप्त कर सकता हूं जैसे 10 अप्रैल वर्तमान दिन है वर्तमान वर्ष का 99 वां दिन है ?? -
iOS डेवलपर

4

IOS 8.0 (और OS X 10) के रूप में आप घटक विधि का उपयोग कर सकते हैं ताकि एक ही तिथि घटक प्राप्त करने के लिए सरल हो सके:

int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]];

चीजों को सरल बनाना चाहिए और उम्मीद है कि यह कुशलता से लागू हो।


2

यदि आप NSDate से अलग-अलग NSDateCompords प्राप्त करना चाहते हैं, तो आपको निश्चित रूप से Itai Ferber द्वारा सुझाए गए समाधान की आवश्यकता होगी। लेकिन अगर आप NSDate से सीधे NSString पर जाना चाहते हैं, तो आप NSDateFormatter का उपयोग कर सकते हैं


2
    NSDate *currDate = [NSDate date];
    NSCalendar*       calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* components = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:currDate];
    NSInteger         day = [components day];
    NSInteger         month = [components month];
    NSInteger         year = [components year];
    NSLog(@"%d/%d/%d", day, month, year);

यह स्पष्ट रूप से मुझे एक पूर्णांक के रूप में वर्ष, महीना या दिन नहीं देता है, जो कि मैंने ओपी में अनुरोध किया है। -1।
रिचर्ड जे रॉस III

1
रिचर्ड जे। रॉस III: मैंने अभी इसे ठीक किया है, मुझे खेद है क्योंकि मेरा उत्तर आपका प्रश्न खो गया था।
लिन न्गुयेन

2

यहाँ स्विफ्ट में समाधान है:

let todayDate = NSDate()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!

// Use a mask to extract the required components. Extract only the required components, since it'll be expensive to compute all available values.
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: todayDate)

var (year, month, date) = (components.year, components.month, components.day) 

2

इसे इस्तेमाल करे । । ।

सांकेतिक टुकड़ा:

 NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
 int year = [components year];
 int month = [components month];
 int day = [components day];

यह वर्तमान वर्ष, माह, तिथि देता है


1

निम्नलिखित आज़माएँ:

    NSString *birthday = @"06/15/1977";
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"MM/dd/yyyy"];
    NSDate *date = [formatter dateFromString:birthday];
    if(date!=nil) {
        NSInteger age = [date timeIntervalSinceNow]/31556926;
        NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
        NSInteger day = [components day];
        NSInteger month = [components month];
        NSInteger year = [components year];

        NSLog(@"Day:%d Month:%d Year:%d Age:%d",day,month,year,age);
    }
    [formatter release];

1

स्विफ्ट 2.x

extension NSDate {
    func currentDateInDayMonthYear() -> String {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "d LLLL yyyy"
        return dateFormatter.stringFromDate(self)
    }
}

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

NSDate().currentDateInDayMonthYear()

उत्पादन

6 March 2016

1

तीव्र

वैकल्पिक स्ट्रिंग के रूप में दिनांक के किसी भी तत्व को प्राप्त करने का आसान तरीका।

extension Date {

  // Year 
  var currentYear: String? {
    return getDateComponent(dateFormat: "yy")
    //return getDateComponent(dateFormat: "yyyy")
  }

  // Month 
  var currentMonth: String? {
    return getDateComponent(dateFormat: "M")
    //return getDateComponent(dateFormat: "MM")
    //return getDateComponent(dateFormat: "MMM")
    //return getDateComponent(dateFormat: "MMMM")
  }


  // Day
  var currentDay: String? {
    return getDateComponent(dateFormat: "dd")
    //return getDateComponent(dateFormat: "d")
  }


  func getDateComponent(dateFormat: String) -> String? {
    let format = DateFormatter()
    format.dateFormat = dateFormat
    return format.string(from: self)
  }


}

let today = Date()
print("Current Year - \(today.currentYear)")  // result Current Year - Optional("2017")
print("Current Month - \(today.currentMonth)")  // result Current Month - Optional("7")
print("Current Day - \(today.currentDay)")  // result Current Day - Optional("10")

0

मैं इस तरह से…।

NSDate * mydate = [NSDate date];

NSCalendar * mycalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;

NSDateComponents * myComponents  = [mycalendar components:units fromDate:mydate];

NSLog(@"%d-%d-%d",myComponents.day,myComponents.month,myComponents.year);

0

मानव पठनीय स्ट्रिंग (दिन, महीने, वर्ष) प्राप्त करने के लिए, आप यह कर सकते हैं:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.