एनएसडी दिन की शुरुआत और दिन की समाप्ति


104
    -(NSDate *)beginningOfDay:(NSDate *)date
{
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDateComponents *components = [cal components:( NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];

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

    return [cal dateFromComponents:components];

}

-(NSDate *)endOfDay:(NSDate *)date
{
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDateComponents *components = [cal components:(  NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit ) fromDate:date];

    [components setHour:23];
    [components setMinute:59];
    [components setSecond:59];

    return [cal dateFromComponents:components];

}

जब मैं फोन करता हूं: [आत्म अंत: प्रार्थना: [एनएसडी दिनांक]]; मुझे महीने का पहला मौका मिलता है ... ऐसा क्यों है? मैं इस दो विधियों का उपयोग करता हूं क्योंकि मुझे एक अंतराल की आवश्यकता होती है जो पहली तारीख के पहले दूसरे से है (शुरुआत: तारीख 1) दूसरी तारीख के अंतिम सेकंड (एंडऑफडे: डेट 2) ...


2
यदि आप घंटों को यूटीसी समय को शून्य पर सेट करना चाहते हैं, तो इसे प्राप्त करने का एक आसान तरीका हैइंटरवाल्विन ..., घंटों को काटें, और फिर एनएसडीट में परिवर्तित करें। और यह एक और समयक्षेत्र के लिए काम करेगा यदि आप पहली बार समय अंतराल को सेकंड्सजोम के सेकंड से समायोजित करते हैं, तो ट्रंक करने के बाद विपरीत तरीके को समायोजित करें। (दिन का अंत स्पष्ट रूप से 23: 59: 59.999 बाद में है, जिसे आप समय अंतराल के साथ सरल जोड़ के साथ प्राप्त कर सकते हैं।)
हॉट लिक्स

"वास्तविक दिन के अंत" के रूप में "दिन का अंत" निर्दिष्ट करना (इस मामले में एक सेकंड) गड़बड़ सॉफ्टवेयर के लिए एक नुस्खा की तरह लगता है। यदि आप 1 एमएस का उपयोग करते हैं, तो ग्लिच कम लगातार होंगे। या आप 23 घंटे का उपयोग कर सकते हैं ताकि किसी भी कीड़े को पकड़े जाने की अधिक संभावना हो। :-)
एडवर्ड ब्रे

जवाबों:


33

आप में गायब NSDayCalendarUnitहैं

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

1
मेरे पास एक अजीब व्यवहार है जहां अगर मैं दिन के घटक को जोड़ता हूं तो मुझे पिछले दिन का 23:00 बजे मिलता है।
माइक एम

3
@ माइक का उपयोग टाइमजोन: Components.timeZone = [NSTimeZone timeZoneWithName: @ "GMT;];
डिमाइक्लोउ

@dimaxyu सही है। स्विफ्ट में इसके: Components.timeZone = NSTimeZone (नाम: "GMT")
टॉम बेवेलेंडर

220

दिन की शुरुआत / दिन का अंत - स्विफ्ट 4

  // Extension

extension Date {
    var startOfDay: Date {
        return Calendar.current.startOfDay(for: self)
    }

    var endOfDay: Date {
        var components = DateComponents()
        components.day = 1
        components.second = -1
        return Calendar.current.date(byAdding: components, to: startOfDay)!
    }

    var startOfMonth: Date {
        let components = Calendar.current.dateComponents([.year, .month], from: startOfDay)
        return Calendar.current.date(from: components)!
    }

    var endOfMonth: Date {
        var components = DateComponents()
        components.month = 1
        components.second = -1
        return Calendar.current.date(byAdding: components, to: startOfMonth)!
    }
}

// End of day = Start of tomorrow minus 1 second
// End of month = Start of next month minus 1 second

1
NSYearCalendarUnit, NSMonthCalendarUnit, और NSDayCalendarUnitआईओएस 8. का उपयोग बंद कर दिया गया है NSCalendarUnitYear, NSCalendarUnitMonthऔर NSCalendarUnitDayबजाय!
टी ब्लैंक

6
दिन की शुरुआत के लिए, iOS8 के लिए [[NSCalendar currentCalendar] startOfDayForDate: ...] का उपयोग करें
जिंजरब्रेडमैन

5
यह वर्तमान समय क्षेत्र में startOfDay लौटाता है! NSDate के UTC में होने की उम्मीद है, लेकिन यह कनवर्टर डिफ़ॉल्ट समयक्षेत्र के लिए सही किया गया समय देता है।
टॉम बेवलैंडर

3
EndOfDay वैकल्पिक क्यों है? क्या ऐसी कोई परिस्थितियां हैं जहां startOfDay शून्य नहीं है, जबकि endOfDay शून्य हो सकती है?
मानसरोवर

1
तो, इस पर निर्भर करते हुए कि आप इसे कैसे उपयोग करते हैं, आप दिनों के अंत और शुरुआत के बीच एक दूसरे अंतराल का
सामना करते हैं।

29

स्विफ्ट 5 सरल और अधिक सटीक उत्तर।

शुरू समय: 00:00:00

अंतिम समय: 23: 59: 59.5

let date = Date() // current date or replace with a specific date
let calendar = Calendar.current
let startTime = calendar.startOfDay(for: date)
let endTime = calendar.date(bySettingHour: 23, minute: 59, second: 59, of: date)

अतिरिक्त

let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: noon)!
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: noon)!
let specificDate = Date("2020-01-01")

extension Date {
    init(_ dateString:String) {
        let dateStringFormatter = DateFormatter()
        dateStringFormatter.dateFormat = "yyyy-MM-dd"
        dateStringFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
        let date = dateStringFormatter.date(from: dateString)!
        self.init(timeInterval:0, since:date)
    }
}

2
यह कैसे अलग है let dateAtEnd = Calendar.current.date(bySettingHour: 23, minute: 59, second: 59, of: Date())?
एंड्रेस कैनेला

1
कोई फर्क नहीं ।
अगस्त लिन

21

IOS 8+ में यह वास्तव में सुविधाजनक है; तुम कर सकते हो:

let startOfDay = NSCalendar.currentCalendar().startOfDayForDate(date)

दिन का अंत प्राप्त करने के लिए बस 23 घंटे, 59 मिनट, 59 सेकंड के लिए NSCalendar विधियों का उपयोग करें, इस बात पर निर्भर करता है कि आप दिन के अंत को कैसे परिभाषित करते हैं।

// Swift 2.0
let components = NSDateComponents()
components.hour = 23
components.minute = 59
components.second = 59
let endOfDay = NSCalendar.currentCalendar().dateByAddingComponents(components, toDate: startOfDay, options: NSCalendarOptions(rawValue: 0))

तारीख मठ

Apple iOS NSCalendar प्रलेखन । (देखें अनुभाग: कैलेंड्रिकल गणनाएँ )

NSHipster द्वारा चर्चा की गई NSCalendar विधियाँ


17

NSDate के लिए मेरी स्विफ्ट एक्सटेंशन:

स्विफ्ट 1.2

extension NSDate {

    func beginningOfDay() -> NSDate {
        var calendar = NSCalendar.currentCalendar()
        var components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: self)
        return calendar.dateFromComponents(components)!
    }

    func endOfDay() -> NSDate {
        var components = NSDateComponents()
        components.day = 1
        var date = NSCalendar.currentCalendar().dateByAddingComponents(components, toDate: self.beginningOfDay(), options: .allZeros)!
        date = date.dateByAddingTimeInterval(-1)!
        return date
    }
}

स्विफ्ट 2.0

extension NSDate {

    func beginningOfDay() -> NSDate {
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components([.Year, .Month, .Day], fromDate: self)
        return calendar.dateFromComponents(components)!
    }

    func endOfDay() -> NSDate {
        let components = NSDateComponents()
        components.day = 1
        var date = NSCalendar.currentCalendar().dateByAddingComponents(components, toDate: self.beginningOfDay(), options: [])!
        date = date.dateByAddingTimeInterval(-1)
        return date
    }
}

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

समयक्षेत्र के मुद्दों को जोड़ने से बचने के लिए: Components.timeZone = NSTimeZone (नाम: "GMT")
टॉम बेवेलैंडर

12

स्विफ्ट 5.1 - XCode 11 के Dateबजाय NSDateऔर Calenderइसके बजाय कक्षा के साथNSCalender

extension Date {

    var startOfDay : Date {
        let calendar = Calendar.current
        let unitFlags = Set<Calendar.Component>([.year, .month, .day])
        let components = calendar.dateComponents(unitFlags, from: self)
        return calendar.date(from: components)!
   }

    var endOfDay : Date {
        var components = DateComponents()
        components.day = 1
        let date = Calendar.current.date(byAdding: components, to: self.startOfDay)
        return (date?.addingTimeInterval(-1))!
    }
}

उपयोग:

    let myDate = Date()
    let startOfDate = myDate.startOfDay
    let endOfDate = myDate.endOfDay

Dateजब मैं खेल के मैदान में इसे आज़माता हूँ तो मुझे अघोषित प्रकार की त्रुटि मिलती है
जॉन डू

1
यह मेरे लिए यहाँ काम कर रहा है। क्या आपने UIKit को आयात किया था import UIKit?
बेन

2
@ बैक डेट और कैलेंडर, UIKit में नहीं है, इसके फाउंडेशन में, हालांकि UIKit इंपोर्ट फाउंडेशन
Arbitur

4

आपको घटकों को शून्य पर सेट करने की आवश्यकता नहीं है, बस उन्हें अनदेखा करें:

-(NSDate *)beginningOfDay:(NSDate *)date
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:date];
    return [calendar dateFromComponents:components];
}

2
"नव उपलब्ध":, [calendar startOfDayForDate:date]लेकिन -endOfDayForDate:दुर्भाग्य से, कोई भी नहीं है ...
जूलियन एफ। वेनर्ट

4

मेरे लिए यहां कोई भी जवाब नहीं है और जहां स्टैकओवरफ्लो पर काम किया गया है। आज की शुरुआत करने के लिए मैंने ऐसा किया।

NSCalendar * gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
[gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];    
NSDateComponents *components = [gregorian components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]]; 
[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
NSDate *beginningOfToday = [gregorian dateFromComponents:components];

इस [gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];और नोट करें [components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

जब कोई कैलेंडर बनाया जाता है, तो उसे वर्तमान समय-क्षेत्र के साथ आरंभ किया जाता है और जब तिथि को उसके घटकों से निकाला जाता है, क्योंकि NSDate में कोई समय-क्षेत्र नहीं होता है, तो वर्तमान समय-क्षेत्र की तिथि को UTC के समय-क्षेत्र के रूप में माना जाता है। इसलिए हमें घटकों को निकालने से पहले समय-सीमा निर्धारित करने की आवश्यकता है और बाद में जब इन घटकों से तारीख निकालते हैं।


4

स्विफ्ट 3

  class func today() -> NSDate {
        return NSDate()
    }

    class func dayStart() -> NSDate {
          return NSCalendar.current.startOfDay(for: NSDate() as Date) as NSDate
    }

    class func dayEnd() -> NSDate {
        let components = NSDateComponents()
        components.day = 1
        components.second = -1
        return NSCalendar.current.date(byAdding: components as DateComponents, to: self.dayStart() as Date)
    }

4

Swift3 * XCode8 का उपयोग करके
Apple NSवर्ग नाम से हटा रहा है ताकि NSDateइसे स्वैप किया जा सकेDate । यदि आप उन्हें यह कहते हुए कास्ट करने की कोशिश करते हैं कि वे हमेशा विफल रहेंगे, तो आपको कंपाइलर की चेतावनी मिल सकती है, लेकिन जब आप उन्हें खेल के मैदान में दौड़ाते हैं तो वे ठीक काम करते हैं।

मैंने अपने जेनरेट किए NSDateगए कोर डेटा मॉडल को बदल दिया Dateऔर वे अभी भी काम करते हैं।

extension Date {
  func startTime() -> Date {
    return Calendar.current.startOfDay(for: self)
  }

  func endTime() -> Date {
    var components = DateComponents()
    components.day = 1
    components.second = -1
    return Calendar.current.date(byAdding: components, to: startTime())!
  }
}

4

स्विफ्ट 3 और इसके बाद के संस्करण में

extension Date {
    var startOfDayDate: Date {
        return Calendar.current.startOfDay(for: self)
    }

    var endOfDayDate: Date {
        let nextDayDate = Calendar.current.date(byAdding: .day, value: 1, to: self.startOfDayDate)!
        return nextDayDate.addingTimeInterval(-1)
    }
}

उपयोग:

var currentDayStart = Date().startOfDayDate
var currentDayEnd = Date().endOfDayDate

2

परिणाम प्राप्त करने का एक और तरीका:

NSDate *date = [NSDate date];

NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = [[NSCalendar currentCalendar] ordinalityOfUnit:(NSCalendarUnitDay) inUnit:(NSCalendarUnitEra) forDate:date];
NSDate *dayBegin = [[NSCalendar currentCalendar] dateFromComponents:components];

components.day += 1;
NSDate *dayEnd = [[NSCalendar currentCalendar] dateFromComponents:components];



2

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

    var calendar = Calendar.current
    calendar.timeZone = NSTimeZone(abbreviation: "UTC")! as TimeZone
    let dateAtMidnight = calendar.startOfDay(for: Date())

    //For End Date
    var components = DateComponents()
    components.day = 1
    components.second = -1

    let dateAtEnd = calendar.date(byAdding: components, to: dateAtMidnight)

    print("dateAtMidnight :: \(dateAtMidnight)")
    print("dateAtEnd :: \(dateAtEnd!)")

2

मुझे लगता है कि स्विफ्ट में ऐसा करने का सबसे रसीला तरीका निम्नानुसार है:

extension Date {
    func startOfDay() -> Date {
        return Calendar.current.startOfDay(for: self)
    }
    func endOfDay() -> Date {
        return Calendar.current.date(bySettingHour: 23, minute: 59, second 59, of: self)
    }
}

यह बिल्कुल सही है! धन्यवाद!
बारां इमरे

1

चूंकि iOS 8.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+फाउंडेशन में एक अंतर्निहित फ़ंक्शन है, जिसे आप बॉक्स से बाहर का उपयोग कर सकते हैं। स्वयं के कार्यों को लागू करने की आवश्यकता नहीं है।

public func startOfDay(for date: Date) -> Date

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

let midnightDate = Calendar(identifier: .gregorian).startOfDay(for: Date())

यह याद रखने योग्य है, कि यह डिवाइस समय क्षेत्र पर विचार करता है। आप सेट कर सकते हैं .timeZoneपर calendarयदि आप जैसे यूटीसी क्षेत्र करना चाहते हैं।

Apple संदर्भ पृष्ठों से लिंक करें: https://developer.apple.com/reference/foundation/nscalendar/1417161-startofday


1

बस एक और तरीका dateInterval(of:start:interval:for:)हैCalendar

वापसी पर startDateदिन की शुरुआत और दिन intervalमें सेकंड की संख्या होती है।

func startAndEnd(of date : Date) -> (start : Date, end : Date) {
    var startDate = Date()
    var interval : TimeInterval = 0.0
    Calendar.current.dateInterval(of: .day, start: &startDate, interval: &interval, for: date)
    var endDate = startDate.addingTimeInterval(interval-1)
    return (start : startDate, end : endDate)
}

let (start, end) = startAndEnd(of: Date())
print(start, end)

1

यह मैं स्विफ्ट 4.2 के लिए उपयोग कर रहा हूं:

    let calendar = Calendar.current
    let fromDate = calendar.startOfDay(for: Date())
    let endDate = calendar.date(bySettingHour: 23, minute: 59, second: 59, of: Date())

मेरे लिए एक आकर्षण की तरह काम करता है। आप इसे प्रारंभ और समाप्ति तिथियों के लिए एक एक्सटेंशन में जोड़ सकते हैं Date, हालांकि ध्यान रखें कि एक्सटेंशन जोड़ने से संकलन समय बढ़ जाता है (जब तक कि वर्ग के रूप में एक ही फाइल में नहीं), इसलिए यदि आपको केवल एक स्थान पर या एक कक्षा में इसकी आवश्यकता है। .. एक एक्सटेंशन का उपयोग न करें।


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

    func firstSecondInDay() -> Date {
        let dayStr = self.stringFrom(dateFormat: "yyyy-MM-dd")
        let firstSecondStr = "\(dayStr) 00:00:00"
        let format = DateFormatter()
        format.dateFormat = "yyyy-MM-dd HH:mm:ss"
        return format.date(from: firstSecondStr)!
    }

    func lastSecondInDay() -> Date {
        let dayStr = self.stringFrom(dateFormat: "yyyy-MM-dd")
        let laseSecondStr = "\(dayStr) 23:59:59"
        let format = DateFormatter()
        format.dateFormat = "yyyy-MM-dd HH:mm:ss"
        return format.date(from: laseSecondStr)!
    }
}

0

बस संदर्भ के लिए, स्विफ्ट 4 में दिन की शुरुआत और अंत सेट करने का सरल तरीका ,

var comp: DateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: Date())
comp.hour = 0
comp.minute = 0
comp.second = 0
comp.timeZone = TimeZone(abbreviation: "UTC")!


//Set Start of Day
let startDate : Date = Calendar.current.date(from: comp)!
print(“Day of Start : \(startDate)")


//Set End of Day
comp.hour = 23
comp.minute = 59
comp.second = 59

let endDate : Date = Calendar.current.date(from:comp)!
print("Day of End : \(endDate)")

-1

कैलेंडर इकाइयों को अंतराल के रूप में सोचा जाना चाहिए। जैसा कि iOS 10 में Calendarइसके लिए कुछ अच्छे तरीके हैं

let day = Calendar.autoupdatingCurrent.dateInterval(of: .day, for: Date())
day?.end
day?.start

आप किसी भी कैलेंडर घटक (सप्ताह / माह / वर्ष आदि) की शुरुआत / अंत प्राप्त करने के लिए एक ही विधि का उपयोग कर सकते हैं


यह गलत है। day?.endकल 12:00 पूर्वाह्न का मूल्यांकन, आज रात 11:59 बजे नहीं।
केसी वेगनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.