দিনের শুরু এবং দিনের শেষে এনএসডেট


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
আপনি যদি ঘন্টাগুলিকে শূন্য ইউটিসি সময় নির্ধারণ করতে চান তবে সময় পাওয়ার সহজ উপায় n আন্তঃআরকালীন সংস্করণ ..., ঘন্টাগুলি কেটে ফেলুন এবং তারপরে আবার এনএসডিটে রূপান্তর করুন। এবং এটি অন্য টাইমজোনটির জন্য কাজ করবে যদি আপনি প্রথমে টাইমজোনটির সেকেন্ডসফর্মজিএমটি দ্বারা সময় ব্যবধানটি সামঞ্জস্য করেন, তারপরে কাটার পরে বিপরীত উপায়ে সামঞ্জস্য করুন। (দিনের সমাপ্তি স্পষ্টত 23: 59: 59.999 পরে, যা আপনার সময় ব্যবধানের সময় সহজ সংযোজন দ্বারা অর্জিত হতে পারে))
হট লিক্স

"দিনের শেষ "টিকে আসল সমাপ্তির আগে কিছু সালিসি সময় হিসাবে নির্দিষ্ট করা (এক্ষেত্রে এক সেকেন্ড) মনে হচ্ছে চটকদার সফ্টওয়্যারটির রেসিপি বলে মনে হচ্ছে। আপনি যদি 1 এমএস ব্যবহার করেন তবে এই সমস্যাগুলি কম ঘন ঘন হবে। অথবা আপনি 23 ঘন্টা ব্যবহার করতে পারেন যাতে কোনও বাগ ধরা পড়ার সম্ভাবনা বেশি থাকে। :-)
এডওয়ার্ড ব্রে

উত্তর:


33

আপনাকে মিস করছে NSDayCalendarUnit

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

1
আমার একটি অদ্ভুত আচরণ রয়েছে যেখানে আমি যদি দিনের অংশটি যুক্ত করি তবে আমি আগের দিনের 23:00 পাই।
মাইক এম

3
@ মাইকে টাইমজোন ব্যবহার করুন: উপাদানগুলি.টাইমজোন = [এনএসটাইমজোন সময়জোনওয়াইথনাম: @ "জিএমটি"];
dimaxyu

@ ডিমাক্সিউ ঠিক আছে। দ্রুত পরিবর্তে এর মধ্যে: উপাদানগুলি.টাইমজোন = এনএসটিমেজোন (নাম: "জিএমটি")
টম বেভল্যান্ডার

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
দিনের শুরু করার জন্য, আইওএস 8 +
জিঞ্জারব্রেডমেন

5
এটি বর্তমান টাইমজোনটিতে স্টার্টঅফডিকে ফিরিয়ে দেয়! এনএসডিট ইউটিসিতে থাকবে বলে আশা করা হচ্ছে তবে এই রূপান্তরকারীটি ডিফল্ট টাইমজোনটির জন্য সংশোধিত সময় দেয় returns
টম বেভল্যান্ডার

3
এন্ডঅফডে optionচ্ছিক কেন? এমন কোনও পরিস্থিতি রয়েছে যেখানে স্টার্টঅফডে শূন্য নয়, যখন এন্ডঅফডে শূন্য হতে পারে?
মনসুরভ রুসলান

1
সুতরাং, কিভাবে আপনি এটি ব্যবহার উপর নির্ভর করে আপনি শেষ হয় এবং দিনের সূত্রপাত মধ্যে এক সেকেন্ড ফাঁক মনে developer.apple.com/documentation/foundation/nsdate/...
atlex2

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

আইওএস 8+ এ এটি সত্যিই সুবিধাজনক; আপনি করতে পারেন:

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

দিনের সমাপ্তি পেতে তারপরে আপনার দিনের কীভাবে সংজ্ঞা দেওয়া হয় তার উপর নির্ভর করে কেবল 23 ঘন্টা, 59 মিনিট, 59 সেকেন্ডের জন্য এনএসসিএলগ্র্যান্ড পদ্ধতিগুলি ব্যবহার করুন।

// 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))

তারিখ গণিত

অ্যাপল আইওএস এনএসক্যালেন্ডার ডকুমেন্টেশন । (বিভাগ দেখুন: ক্যালেন্ডারিক্যাল গণনা )

এনএসএইচপ্লেটার দ্বারা আলোচিত এনএসক্যালেন্ডার পদ্ধতি


17

এনএসডেটের জন্য আমার সুইফট এক্সটেনশনগুলি:

সুইফট ১.২

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
    }
}

সুইফট ২.০

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
    }
}

আপনি কেবল -1 এ দ্বিতীয় সেট করতে পারেন এবং তারিখবাইএডিংটাইমআইন্টারওয়াল ব্যবহার না করেই এটি পেতে পারেন
বেন সিনক্লেয়ার

টাইমজোন সমস্যাগুলি এড়ানোর জন্য: উপাদানগুলি.টাইমজোন = এনএসটিমেজোন (নাম: "জিএমটি")
টম বেভল্যান্ডার

12

Dateপরিবর্তে NSDateএবং Calenderপরিবর্তে ক্লাস সহ সুইফ্ট 5.1 - এক্সকোড 11NSCalender

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
এটি আমার জন্য এখানে কাজ করছে। আপনি কি ইউআইকিট দিয়ে আমদানি করেছেন import UIKit?
বেন

2
@ বেন তারিখ এবং ক্যালেন্ডার ইউআইকিট-এ নেই, এটি ফাউন্ডেশনে, তবে ইউআইকিট ফাউন্ডেশন আমদানি করে
আরবিটুর

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]];

যখন কোনও ক্যালেন্ডার তৈরি করা হয় এটি বর্তমান টাইমজোন দিয়ে আরম্ভ করা হয় এবং তারিখটি যখন তার উপাদানগুলি থেকে বের করা হয়, যেহেতু এনএসডেটের কোনও টাইমজোন নেই, তাই বর্তমান টাইমজোন থেকে তারিখটি ইউটিসি টাইমজোন হিসাবে বিবেচিত হয়। সুতরাং উপাদানগুলি বের করার আগে এবং পরে এই উপাদানগুলি থেকে তারিখ বের করার সময় আমাদের সময় অঞ্চল নির্ধারণ করতে হবে।


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

সুইফট 3 ব্যবহার করে * এক্সকোড 8
অ্যাপল 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

আপনি NSDayCalendarUnitউপাদানগুলি অনুপস্থিত ।


2

উদ্দেশ্য গ

NSCalendar * calendar = [NSCalendar currentCalendar];
NSDate * startDate = [calendar startOfDayForDate:[NSDate date]];
NSLog(@"start date is %@", startDate);

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আপনি যেমন ইউটিসি জোন করাতে চাই।

অ্যাপল রেফারেন্স পৃষ্ঠাগুলিতে লিঙ্ক করুন: https://developer.apple.com/references/foundation/nscocolate/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

এটি আমি সুইফট ৪.২ এর জন্য ব্যবহার করি:

    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

ক্যালেন্ডার ইউনিটগুলি অন্তর হিসাবে বিবেচনা করা উচিত। আইওএস 10 হিসাবে এর Calendarজন্য কয়েকটি দুর্দান্ত পদ্ধতি রয়েছে

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

যে কোনও ক্যালেন্ডারের উপাদান (সপ্তাহ / মাস / বছর ইত্যাদি) শুরু / শেষ পেতে আপনি একই পদ্ধতিটি ব্যবহার করতে পারেন


এটি ভুল। day?.endআজকের রাত 11:59 pm নয়, কাল 12:00 এ মূল্যায়ন করে।
কেসি ওয়াগনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.