【问题标题】:NSDate for first day of the month每月第一天的 NSDate
【发布时间】:2010-09-16 10:18:44
【问题描述】:

这是一个非常简单的概念,但到目前为止我还没有找到一个优雅的(并且独立于日历区域设置)的解决方案。我需要为任意NSDate 找到该月的第一天。例如,给定一个任意的NSDate (arbitraryDate) 将返回另一个 NSDate 对象(我们称之为firstDayOfMonthDate),它表示arbitraryDate 中的一个月的第一天。时间部分无关紧要,因为我只需要一个月的第一天的 NSDate 对象(尽管为了简洁起见,如果时间只是清零会很有用)。

提前感谢您的帮助。

【问题讨论】:

  • 你能用例子解释一下吗
  • 我想提供一个带有 NSDate 的函数,例如 2010 年 9 月 16 日。然后该函数将返回另一个 NSDate,即该月的第一天。继续前面的示例,将返回的 NSDate 是 2010 年 9 月 1 日。我意识到有多种替代方法可以完成此最终结果(将原始日期拆分为组件,然后将日期组件重新构建为 1)但我在想必须有一个更优雅的解决方案。

标签: iphone cocoa-touch nsdate nscalendar


【解决方案1】:

一个可能的解决方案:

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];

【讨论】:

  • 感谢您的建议。但是,这仅适用于公历。是否可以使它独立于日历区域设置/格式,因为我希望我正在构建的应用程序可以在 iPhone 上支持的所有日历格式上工作?
  • 你可以使用 [NSCalendar currentCalendar]
  • 谢谢伙计。完美运行。
  • @diciu +1 我也是 .. 它有效但可能是因为 timezome 我得到了错误的日期。我如何设置它。通过日期 2012-04-26 06:55:40 +0000 我得到 2012-03-31 18:30:00 +0000。
【解决方案2】:
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]]);

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      斯威夫特版本

      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)
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-02
          • 2012-12-12
          • 2011-09-29
          • 1970-01-01
          • 2013-09-22
          • 1970-01-01
          • 2021-05-25
          相关资源
          最近更新 更多