簡體   English   中英

獲取一個月的所有 NSDate(以及相鄰周的日期)

[英]Get all NSDate of a month (and the dates in adjacent weeks)

給定一個日期(例如今天4 Feb 2014 ),我想獲取從Monday 27 Jan 2014Sunday 2 Mar 2014NSDate實例列表。

基本上是當月的所有日期,加上上個月最后一周和下個月第一周的日期,如果它們與當月的某些日期共享同一周。

我怎樣才能做到這一點?

在此處輸入圖片說明

我可以想出一種方法來獲得這個(下面的偽代碼),但它太長太復雜了。 有沒有更簡單的方法,比如SDK提供的快捷方式?

  1. 從 [NSDate date](今天)中提取月份組件
  2. 構造一個月的第一天
  3. 計算它的工作日
  4. 如果是星期三(一周的第 3 天),則將 today-1、today-2 添加到列表中,依此類推
  5. 從第 2 步開始重復,但在本月的最后一天

同樣對於那里的所有精英,僅僅因為我沒有發布任何代碼,並不意味着這不是一個編碼問題。 問題是真實的(構建一個月的日歷網格),並且在編碼之前找到正確的算法/方法比使用 NSDate 和 NSCalendar 手動進行數學運算要好得多(非常容易出錯,因為我需要考慮考慮所有奇怪的情況)。 我想很多人已經遇到過同樣的問題,如果他們能分享一些建議,那就太好了。 如果您不想回答,則無需回復。

我將發布非常通用的代碼。 您將需要使其特定於您的需求。

//Setup the calendar object
NSCalendar *calendar = [NSCalendar currentCalendar];

//Get the current date's month
NSUInteger month = [dateComponents month];

//Create an NSDate for the first and last day of the month
NSDateComponents *comp = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]];
[comp setDay:1];
NSDate *firstOfMonth = [calendar dateFromComponents:comp];
[comp setMonth:[comp month]+1];
[comp setDay:0];
NSDate *lastOfMonth = [calendar dateFromComponents:comp];

//Now get the first and last week number from there
NSUInteger unitFlags = NSWeekCalendarUnit;
//Create a date component object from today's date.
NSDateComponents *firstDateComponents = [calendar components:unitFlags
                                                   fromDate:firstOfMonth // for current date
                                                    options:0];
NSDateComponents *lastDateComponents = [calendar components:unitFlags
                                                   fromDate:lastOfMonth // for current date
                                                    options:0];


NSUInteger firstWeek = [firstDateComponents week];
NSUInteger lastWeek = [lastDateComponents week];

現在您有了第一周和最后一周,您可以從第一周的第一天開始,並通過最后一周的最后一天來設置日歷。 祝你好運。

斯威夫特 5:

extension Date {
    
    var startOfMonth: Date {
        
        let calendar = Calendar(identifier: .gregorian)
        let components = calendar.dateComponents([.year, .month], from: self)
        
        return  calendar.date(from: components)!
    }

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

let date = Date()

let firstWeek = Calendar.current.dateComponents([.weekOfYear], from: date.startOfMonth)
let lastWeek = Calendar.current.dateComponents([.weekOfYear], from: date.endOfMonth)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM