2010-09-16 72 views
27

这是一个相当简单的概念,但至今我一直无法找到一个优雅的(和日历区域独立)解决方案。我需要找到任意NSDate的月份的第一天。例如,给定任意NSDatearbitraryDate),将返回另一个NSDate对象(我们称之为firstDayOfMonthDate),该对象表示arbitraryDate中的月份的第一天。时间组件并不重要,因为我只需要一个月的第一天使用NSDate对象(尽管对于整洁来说,如果时间刚刚被清零,它将会很有用)。本月的第一天的NSDate

在此先感谢您的帮助。

+0

u能与例如 – 2010-09-16 10:28:24

+0

解释它,我想提供一个函数2010一个NSDate如9月16日然后,该函数将返回另一个的NSDate其为第一那一天。继续前面的例子,将返回的NSDate是2010年9月1日。我意识到有各种各样的替代方法可以完成这个最终结果(将原始日期拆分为组件,然后使用day组件重建),但我想必须有更优雅的解决方案。 – Skoota 2010-09-16 10:33:26

回答

66

一个可能的解决方案:

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

感谢您的建议。但是,这只适用于公历。是否有可能使日历语言环境/格式独立,因为我希望我所创建的应用能够跨iPhone所支持的所有日历格式工作? – Skoota 2010-09-16 10:35:55

+9

你可以使用[NSCalendar currentCalendar] – diciu 2010-09-16 12:30:16

+0

感谢队友。完美运作。 – Skoota 2010-09-17 07:49:10

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

斯威夫特版本

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

斯威夫特3

我已经包括获得该月的最后一天的情况下,它是对任何人都有用。

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

夫特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)!