2010-09-16 25 views
27

Đây là một khái niệm khá đơn giản, nhưng tôi chưa thể tìm thấy một giải pháp thanh lịch (và lịch độc lập). Tôi cần tìm ngày đầu tiên của tháng cho một tùy ý NSDate. Ví dụ, được cho một tùy ý NSDate (arbitraryDate) một đối tượng NSDate khác sẽ được trả lại (hãy gọi số này firstDayOfMonthDate) đại diện cho ngày đầu tiên của tháng trong arbitraryDate. Thành phần thời gian không quan trọng, vì tôi chỉ cần đối tượng NSDate cho ngày đầu tiên của tháng (mặc dù cho sự gọn gàng thì nó sẽ hữu ích nếu thời gian chỉ là zeroed out).NSDate cho ngày đầu tiên của tháng

Cảm ơn bạn trước vì đã hỗ trợ.

+0

u có thể giải thích nó với ví dụ –

+0

tôi muốn cung cấp một chức năng với một NSDate như ngày 16 tháng 9 năm 2010. Các chức năng sau đó sẽ trở lại khác NSDate đó là lần đầu tiên ngày của tháng đó. Tiếp tục ví dụ trước, NSDate sẽ được trả về là 1 tháng 9 năm 2010. Tôi nhận ra rằng có nhiều cách khác nhau để thực hiện kết quả cuối cùng này (tách ngày ban đầu thành các thành phần, sau đó xây dựng lại với thành phần ngày là 1) nhưng tôi đang nghĩ rằng phải có một giải pháp thanh lịch hơn. – Skoota

Trả lời

66

Một giải pháp khả thi:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *arbitraryDate = [NSDate date]; 
NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:arbitraryDate]; 
[comp setDay:1]; 
NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp]; 
+0

Cảm ơn đề xuất của bạn. Tuy nhiên, điều này sẽ chỉ làm việc với lịch Gregorian. Có thể biến nó thành ngôn ngữ/định dạng lịch độc lập, vì tôi muốn ứng dụng tôi đang xây dựng hoạt động trên tất cả các định dạng lịch được hỗ trợ trên iPhone không? – Skoota

+9

bạn có thể sử dụng [NSCalendar currentCalendar] – diciu

+0

Cảm ơn bạn đời. Làm việc hoàn hảo. – Skoota

7
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear 
                   fromDate:[NSDate date]]; 
components.day = 1; 
NSDate *firstDayOfMonthDate = [[NSCalendar currentCalendar] dateFromComponents: components]; 
NSLog(@"First day of month: %@", [firstDayOfMonthDate descriptionWithLocale:[NSLocale currentLocale]]); 
1

Swift phiên bản

let arbitraryDate:NSDate = NSDate() 
let calendar:NSCalendar = NSCalendar.currentCalendar() 
let components:NSDateComponents = calendar.components([.Year, .Month, .Day], fromDate: arbitraryDate) 
components.setValue(1, forComponent: .Day) 
let firstDayOfMonthDate = calendar.dateFromComponents(components) 
4

Swift 3

Tôi đã bao gồm nhận ngày cuối cùng của tháng trong trường hợp nó là hữu ích cho bất cứ ai.

extension Date { 
    func lastDayOfMonth() -> Date { 
     let calendar = Calendar.current 
     let dayRange = calendar.range(of: .day, in: .month, for: self) 
     let dayCount = dayRange!.count 
     var comp = calendar.dateComponents([.year, .month, .day], from: self) 

     comp.day = dayCount 

     return calendar.date(from: comp)! 
    } 

    func firstDayOfMonth() -> Date { 
     let calendar: Calendar = Calendar.current 
     var components: DateComponents = calendar.dateComponents([.year, .month, .day], from: self) 
     components.setValue(1, for: .day) 
     return calendar.date(from: components)! 
    } 
} 
0

Swift 3:

let calendar = Calendar.current 
var comps = calendar.dateComponents([.year, .month], from: date) 
comps.setValue(1, for: .day) 
let firstDayOfMonth = calendar.date(from: comps)! 

// I tried this, but it doesn't work, why? 
// let firstDayOfMonth = calendar.date(bySetting: .day, value: 1, of: date)!