【问题标题】:Get first day in a month from NSCalendar从 NSCalendar 获取一个月的第一天
【发布时间】:2013-02-14 11:13:18
【问题描述】:

我有一个方法的这个子集,需要获取当前月份的第一天。

NSDate *today = [NSDate date];  // returns correctly 28 february 2013
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = 1;
NSDate *dayOneInCurrentMonth = [gregorian dateByAddingComponents:components toDate:today options:0];

dayOneInCurrentMonth 然后打印出2013-03-01 09:53:49 +0000,即下个月的第一天。

如何获得当月的第一天?

【问题讨论】:

    标签: cocoa cocoa-touch calendar nscalendar nsdatecomponents


    【解决方案1】:

    您的逻辑是错误的:您没有将日期的天数设置为 1,而是在当前日期上添加了一天。

    试试这样的:

    NSDate *today = [NSDate date];
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    
    NSDateComponents *components = [gregorian components:(NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit) fromDate:today];
    components.day = 1;
    
    NSDate *dayOneInCurrentMonth = [gregorian dateFromComponents:components];
    

    【讨论】:

    • 当然!误读方法名称。谢谢!将接受答案:-)
    • 好的,@Fabian Kreiser,我按原样使用了代码,它给了我结果:2015-05-31 21:00:00 UTC。今天是2015-06-08 8:36。它不返回第 1 天,而是从上个月返回?
    【解决方案2】:

    你想要[NSCalender dateFromComponents:]

    NSDate *dayOneInCurrentMonth = [gregorian dateFromComponents:components];
    

    【讨论】:

      【解决方案3】:

      从给定日期到第一天的简单方法:

      NSDate *first = [gregorian dateBySettingUnit:NSCalendarUnitDay value:1 ofDate:date options:0]; 
      

      【讨论】:

        【解决方案4】:

        获取上个月的第一个和最后一个日期的简单方法是:

        NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
        NSDateComponents *comp = [gregorian components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay ) fromDate:[NSDate date]];
        
        //TO GET PREVIOUS MONTH LAST DAY
        [comp setMonth:[comp month]];
        [comp setDay:1];
        NSDate *tDateMonth = [gregorian dateFromComponents:comp];
        NSLog(@"LAST DAY OF PREVIOUS MONTH ;  %@", tDateMonth);
        
        //TO GET PREVIOUS MONTH FIRST DAY
        [comp setMonth:[comp month]-1];
        [comp setDay:3];
        NSDate *td = [gregorian dateFromComponents:comp];
        NSLog(@"FIRST DAY OF PREVIOUS MONTH ;  %@", td);
        

        希望对你有帮助

        【讨论】:

          【解决方案5】:

          通过创建新变量会消耗内存,最好使用日期格式化程序来获取当前月份的第一天

          today = [NSDate date];
          
          firstDayDateFormatter = [[NSDateFormatter alloc] init];
          [firstDayDateFormatter setDateFormat:@"01-MM-yyyy"];
          dateFormatter = [[NSDateFormatter alloc] init];
          [dateFormatter setDateFormat:@"dd-MM-yyyy"];
          [dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US"]];
          firstDayOfTheMonth = [mdfDateFormat dateFromString:[firstDayDateFormatter stringFromDate:today]];
          

          【讨论】:

            【解决方案6】:
            NSDate *startDate = nil;
            [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitMonth startDate:&startDate interval:NULL forDate:date];
            
            return startDate;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-11-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-09-27
              • 2019-03-04
              • 1970-01-01
              相关资源
              最近更新 更多