Iphone 每月第一天的日期

Iphone 每月第一天的日期,iphone,cocoa-touch,nsdate,nscalendar,Iphone,Cocoa Touch,Nsdate,Nscalendar,这是一个非常简单的概念,但到目前为止,我还无法找到一个优雅的(与日历区域设置无关的)解决方案。我需要为任意的NSDate查找月份的第一天。例如,给定一个任意的NSDate(ArricryDate),将返回另一个NSDate对象(我们称之为firstDayOfMonthDate),它表示ArricryDate中的月份第一天。时间部分并不重要,因为我只需要一个月的第一天的NSDate对象(尽管对于整洁性来说,如果时间刚刚归零,它会很有用) 提前感谢您的帮助。可能的解决方案: NSCalendar *

这是一个非常简单的概念,但到目前为止,我还无法找到一个优雅的(与日历区域设置无关的)解决方案。我需要为任意的
NSDate
查找月份的第一天。例如,给定一个任意的
NSDate
ArricryDate
),将返回另一个NSDate对象(我们称之为
firstDayOfMonthDate
),它表示
ArricryDate
中的月份第一天。时间部分并不重要,因为我只需要一个月的第一天的NSDate对象(尽管对于整洁性来说,如果时间刚刚归零,它会很有用)

提前感谢您的帮助。

可能的解决方案:

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];
快速版本

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)

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

你能举例说明吗?我想提供一个日期为2010年9月16日的函数。然后,该函数将返回另一个NSDate,即该月的第一天。继续上一个示例,将返回的NSDate为2010年9月1日。我意识到有多种替代方法可以实现这一最终结果(将原始日期拆分为多个组件,然后使用日期组件1进行重建),但我认为必须有一个更优雅的解决方案。感谢您的建议。然而,这只适用于公历。我希望我正在构建的应用程序能够跨iPhone上支持的所有日历格式工作,是否可以使其独立于日历区域设置/格式?您可以使用[NSCalendar currentCalendar]谢谢。工作得很好。@diciu+1也来自我。它工作得很好,但可能是因为时间问题。我得到了错误的日期。我如何设置它。通过日期2012-04-26 06:55:40+0000&我得到2012-03-31 18:30:00+0000。
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)!