如果你使用的是iOS 10+或者MacOS 10.12+,你可以使用這兩個Calendar
方法正確地做到這一點。
func date(byAdding component: Calendar.Component, value: Int, to date: Date, wrappingComponents: Bool = default) -> Date?
(docs)
func dateInterval(of component: Calendar.Component, for date: Date) -> DateInterval?
(docs)
下面是如何在斯威夫特3使用這些方法,在我的時區輸出的遊樂場以及一個例子。
let calendar = Calendar.current
let now = Date()
// => "Apr 28, 2017, 3:33 PM"
let yesterday = calendar.date(byAdding: .day, value: -1, to: now)
// => "Apr 29, 2017, 3:33 PM"
let yesterdayStartOfDay = calendar.startOfDay(for: yesterday!)
// => ""Apr 29, 2017, 12:00 AM"
let thisWeekInterval = calendar.dateInterval(of: .weekOfYear, for: now)
// => 2017-04-23 04:00:00 +0000 to 2017-04-30 04:00:00 +0000
let thisMonthInterval = calendar.dateInterval(of: .month, for: now)
// => 2017-04-01 04:00:00 +0000 to 2017-05-01 04:00:00 +0000
let aDateInLastWeek = calendar.date(byAdding: .weekOfYear, value: -1, to: now)
let lastWeekInterval = calendar.dateInterval(of: .weekOfYear, for: aDateInLastWeek!)
// => 2017-04-16 04:00:00 +0000 to 2017-04-23 04:00:00 +0000
let aDateInLastMonth = calendar.date(byAdding: .month, value: -1, to: now)
let lastMonthInterval = calendar.dateInterval(of: .weekOfYear, for: aDateInLastMonth!)
// => 2017-03-26 04:00:00 +0000 to 2017-04-02 04:00:00 +0000
紅利:您可以使用DateInterval
s來測試日期是否落入該範圍。從上面繼續:
thisWeekInterval!.contains(now)
// => true
lastMonthInterval!.contains(now)
// => false
你正在使用'fromDate:[[NSDate alloc] init]'位全部泄漏內存。 – 2009-12-23 06:53:36
@Shaggy Frog:我想他假設ARC已啓用...;) – orj 2012-03-13 05:30:35
此代碼無法正常工作。它沒有考慮到輸入日期的一小部分。也就是說,日期可能有30.1234秒,而NSDateComponents只有30秒作爲秒數,因此從NSDate減去30秒會使您在午夜過後0.1234秒。此外,有些日子有更多(或少於)24小時(夏令時),因此獲取昨天的日期實際上應該使用[組件setDay:-1]而不是[組件setHour:-24]。 – orj 2012-03-13 05:33:51