2012-01-27 10 views
56

एनएसडीएटी ऑब्जेक्ट प्राप्त करने का सबसे प्रभावी तरीका क्या है जो वर्तमान दिन के मध्यरात्रि का प्रतिनिधित्व करता है?आज रात आधी रात में मैं एनएसडीएट ऑब्जेक्ट कैसे प्राप्त कर सकता हूं?

+0

देखें [एक समान प्रश्न के लिए मेरा उत्तर] (http://stackoverflow.com/a/43121423/ 1 9 6610 9) जो इस समस्या को हल करने के लिए चार तरीकों की पेशकश करता है (स्विफ्ट 3 के साथ)। –

उत्तर

65

इस प्रयास करें:

NSDate *const date = NSDate.date; 
NSCalendar *const calendar = NSCalendar.currentCalendar; 
NSCalendarUnit const preservedComponents = (NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay); 
NSDateComponents *const components = [calendar components:preservedComponents fromDate:date]; 
NSDate *const normalizedDate = [calendar dateFromComponents:components]; 
+0

मेरे लिए काम नहीं करते हैं। मेरी वर्तमान तिथि के लिए '2013-08-22 10:05:45 + 0000' रिटर्न' 2013-08-21 22:00:00 + 0000' है। तब मैंने 'NSDateComponents' का उपयोग किया है और 'setHour',' setMinute' और 'setHour' को 0 के साथ भेज दिया है और अभी भी कोई अच्छा नहीं है। –

+1

आपके द्वारा यहां पोस्ट की गई तिथि स्ट्रिंग को सिम्युलेटर में स्पष्ट रूप से लॉग किया गया था। यह स्वचालित रूप से आपके टाइमज़ोन को अपनाने लगता है, संग्रहीत वास्तविक दिनांक मध्यरात्रि में है। –

+0

नहीं, यह असली डिवाइस है। अभी भी यह नहीं समझ सकता ... –

1

कोशिश यह:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *now = [NSDate date]; 
NSDateComponents *components = [gregorian components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:now]; 
NSDateFormatter* df = [[NSDateFormatter alloc]init]; 
[df setDateFormat:@"MM/dd/yyyy HH:mm:ss.SSS"]; 
NSLog(@"%@",[df stringFromDate:[gregorian dateFromComponents:components]]); 
11
NSCalendar *cal = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
[cal setTimeZone:[NSTimeZone systemTimeZone]]; 

NSDateComponents * comp = [cal components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:[NSDate date]]; 

[comp setMinute:0]; 
[comp setHour:0]; 
[comp setSecond:0]; 

NSDate *startOfToday = [cal dateFromComponents:comp]; 

आप 23 के रूप में 23:59 तो सेट घटक के घंटे और 59

+3

आपका उत्तर सेकंड उपेक्षा करता है ... – ArtOfWarfare

8

के रूप में मिनट के रूप में आधी रात मतलब तो आप एनएसडीएट के लिए मध्यरात्रि मूल्य प्राप्त करने के लिए निम्न विधि का उपयोग कर सकते हैं।

- (NSDate *)dateAtBeginningOfDayForDate:(NSDate *)inputDate 
{ 
    // Use the user's current calendar and time zone 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSTimeZone *timeZone = [NSTimeZone systemTimeZone]; 
    [calendar setTimeZone:timeZone]; 

    // Selectively convert the date components (year, month, day) of the input date 
    NSDateComponents *dateComps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:inputDate]; 

    // Set the time components manually 
    [dateComps setHour:0]; 
    [dateComps setMinute:0]; 
    [dateComps setSecond:0]; 

    // Convert back  
    NSDate *beginningOfDay = [calendar dateFromComponents:dateComps]; 
    return beginningOfDay; 
} 

Thkis यहां website से लिया गया है।

7

स्विफ्ट:

let cal = NSCalendar.currentCalendar() 

//tip:NSCalendarUnit can be omitted, but with the presence of it, you can take advantage of Xcode's auto-completion 
var comps = cal.components(NSCalendarUnit.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit | .HourCalendarUnit | .MinuteCalendarUnit | .SecondCalendarUnit, fromDate: NSDate()) 
comps.hour = 0 
comps.minute = 0 
comps.second = 0 

let midnightOfToday = cal.dateFromComponents(comps)! 

स्विफ्ट 2.2:

let cal = NSCalendar.currentCalendar() 

let comps = cal.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: NSDate()) 
comps.hour = 0 
comps.minute = 0 
comps.second = 0 

let midnightOfToday = cal.dateFromComponents(comps)! 

ऑब्जेक्टिव-सी:

NSCalendar *cal = [NSCalendar currentCalendar]; 

NSDateComponents *comps = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:[NSDate date]];  
[comps setHour:0]; 
[comps setMinute:0]; 
[comps setSecond:0]; 

NSDate *midnightOfToday = [cal dateFromComponents:comps]; 
1
NSDate *now = [NSDate date]; 
NSDate *beginningOfToday = nil; 
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfToday interval:NULL forDate:now]; 
91

iOS 8 में नई एपीआई

+०१२३५१६४१०६

iOS 8 NSCalendar पर एक नई पद्धति startOfDayForDate बुलाया भी शामिल है, जो उपयोग करने के लिए वास्तव में आसान है:

let startOfToday = NSCalendar.currentCalendar().startOfDayForDate(NSDate()) 

एप्पल के विवरण:

यह API देता है कि किसी निश्चित तिथि के पहले पल तारीख । [NSDate तिथि] में पास करें, उदाहरण के लिए, यदि आप "आज" की शुरुआत चाहते हैं। यदि दो मध्यरात्रि थे, तो यह पहला लौटाता है। यदि कोई नहीं था, तो यह पहला क्षण देता है जो अस्तित्व में था।

अद्यतन, समय क्षेत्र के बारे में:

के बाद से startOfDayForDate NSCalendar पर एक विधि है, यह NSCalendar के समय क्षेत्र का उपयोग करता है। अगर मैं क्या समय हुआ न्यूयॉर्क में थे देखना चाहता था, जब आज लॉस एंजिल्स में शुरू हुआ, मैं ऐसा कर सकता है तो:

let losAngelesCalendar = NSCalendar.currentCalendar().copy() as! NSCalendar 
losAngelesCalendar.timeZone = NSTimeZone(name: "America/Los_Angeles")! 

let dateTodayBeganInLosAngeles = losAngelesCalendar.startOfDayForDate(NSDate()) 
dateTodayBeganInLosAngeles.timeIntervalSince1970 

let dateFormatter = NSDateFormatter() 
dateFormatter.dateStyle = .MediumStyle 
dateFormatter.timeStyle = .ShortStyle 
dateFormatter.timeZone = NSTimeZone(name: "America/New_York")! 
let timeInNewYorkWhenTodayBeganInLosAngeles = dateFormatter.stringFromDate(dateTodayBeganInLosAngeles) 
print(timeInNewYorkWhenTodayBeganInLosAngeles) // prints "Jul 29, 2015, 3:00 AM" 
+0

क्या यह समय क्षेत्र को संभालता है? – ftvs

+1

@ftvs, हाँ, क्योंकि स्टार्टऑफडेफॉरडेट() एनएससीएंडरडर पर एक विधि है, तो आप अपने एनएससीएंडेंडर इंस्टेंस पर टाइमज़ोन सेट कर सकते हैं। ऊपर दिया गया उदाहरण कोड NSCalender.currentCalendar() का उपयोग करता है जो उपयोगकर्ता के वर्तमान समय क्षेत्र का उपयोग करता है। आप अपना स्वयं का एनएससीएंडरडर बना सकते हैं और समय क्षेत्र को विभिन्न मानों पर सेट कर सकते हैं। –

+2

@ftvs, मैंने समय क्षेत्र के बारे में अधिक जानकारी के साथ अपना उत्तर अपडेट किया। –

0
let calendar = NSCalendar.currentCalendar() 
    let unitFlags: NSCalendarUnit = [.Year, .Month, .Day, .Minute, .Second] 
    let components = calendar.components(unitFlags , fromDate: NSDate()) 

    components.hour = 0 
    components.minute = 0 
    components.second = 0 

    //Gives Midnight time of today 
    let midnightOfToday = calendar.dateFromComponents(components)! 
+0

में आपके उत्तर में कुछ स्पष्टीकरण शामिल है, ओपी ने इस – HaveNoDisplayName

0

आप इस्तेमाल कर सकते हैं NSCalendar के dateBySettingHour:minute:second:ofDate:options:

तो यह करने के रूप में आसान होगा:

NSCalendar *calendar = [NSCalendar currentCalendar]; 
calendar.timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; 

NSDate *midnight = [calendar dateBySettingHour:0 minute:0 second:0 ofDate:[NSDate date] options:0]; 
-1

आईओएस 8 से, आप startDayForDate का उपयोग कर सकते हैं।

तो, आदेश आज की शुरुआत (वस्तुनिष्ठ -सी) प्राप्त करने के लिए:

NSDate * midnight; midnight = [[NSCalendar currentCalendar] startOfDayForDate: [NSDate date]];

+0

का उपयोग क्यों किया, जबकि यह लिंक प्रश्न का उत्तर दे सकता है, यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाले पदों/18678902) – Akshay

संबंधित मुद्दे