web-dev-qa-db-ja.com

NSDateの一日の始まりと終わり

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

}

呼び出すとき:[self endOfDay:[NSDate date]];私は月の最初を取得します...なぜですか?最初の日付の最初の秒(beginningOfDay:date1)から最後の秒の日付(endOfDay:Date2)までの間隔が必要なため、この2つの方法を使用します...

89
user1028028

NSDayCalendarUnitがありません

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

一日の始まり/一日の終わり— Swift 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
188
Zelko

Swift 4シンプルで正確な答え。

開始時間: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)
22
August Lin

IOS 8以降では、これは非常に便利です。できるよ:

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

一日の終わりを取得するには、一日の終わりの定義に応じて、NSCalendarメソッドを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))

日付の計算

Apple iOS NSCalendarドキュメント 。 (セクションを参照してください:Calendrical Calculations

NSHipsterで議論されているNSCalendarメソッド

21
Bryan Bryce

My Swift NSDateの拡張:

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

Swift 2.

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
    }
}
16
Libor Zapletal

Swift 4.2-XCode 1Dateの代わりに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
11
Ben

コンポーネントをゼロに設定する必要はなく、単に無視します。

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

Swift使用* XCode8
AppleはNSNSDateに交換できるように、クラス名からDateを削除しています。それらが常に失敗するというキャストを試みると、コンパイラの警告が表示される場合がありますが、プレイグラウンドで実行すると正常に動作します。

コアデータモデルで生成されたNSDateDateに置き換えましたが、引き続き機能します。

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
John Doe

Swift

  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
Jaseem Abbas

私にとっては、ここでもスタックオーバーフローのどこでも答えはありませんでした。今日のスタートを切るためにこれをやった。

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タイムゾーンと見なされます。そのため、コンポーネントを抽出する前にタイムゾーンを設定し、後でこれらのコンポーネントから日付を抽出するときにタイムゾーンを設定する必要があります。

3
Vikram Rao

In Swift 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
Gurjit Singh

Objective-C

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

コンポーネントにNSDayCalendarUnitがありません。

2
LombaX

結果を取得するもう1つの方法:

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
k06a

Swift 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!)")
1
Hardik Thakkar

これは、Swift 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の開始日と終了日の拡張機能にこれを追加できますが、拡張機能を追加するとコンパイル時間が長くなることに注意してください(クラスと同じファイルではない場合)。配置するか、1つのクラスに...拡張機能を使用しないでください。

1
Paul Peelen

_iOS 8.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+_にはFoundationに組み込み関数があり、すぐに使用できます。独自の機能を実装する必要はありません。

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

したがって、次のように使用できます。

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

これは、デバイスのタイムゾーンを考慮に入れることを覚えておく価値があります。 UTCゾーンなどが必要な場合は、calendarに_.timeZone_を設定できます。

Appleリファレンスページ: https://developer.Apple.com/reference/foundation/nscalendar/1417161-startofday へのリンク。

1
Vive

CalendardateInterval(of:start:interval:for:)を使用する別の方法

戻り時に、startDateには1日の始まりが含まれ、intervalには1日の秒数が含まれます。

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
vadian

カレンダーユニットは間隔と見なす必要があります。 iOS 10の時点で、Calendarにはこのための素敵なメソッドがいくつかあります

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

同じ方法を使用して、カレンダーコンポーネントの開始/終了(週/月/年など)を取得できます。

0
David Arve
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
Mint

参考のため、Swift 4で1日の開始と終了を設定する簡単な方法、

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)")
0