【问题标题】:How to find what day of the week for any given date using Cocoa如何使用 Cocoa 查找任何给定日期的星期几
【发布时间】:2010-11-06 15:21:28
【问题描述】:

我试图找出任何给定日期(即 2009 年 6 月 27 日)的哪一天(即星期一、星期五...)

谢谢。

【问题讨论】:

  • 请尝试区分Objective-C和Cocoa。使用一个而没有另一个是完全可行的,但在日期的情况下,我假设你在谈论 Cocoa。
  • 虽然它们是不同的实体,但在没有 Cocoa 的情况下使用 Objective-C 可以说比使用 Objective-C 更容易,反之亦然。即使他们使用 Python 中的 Cocoa 或其他任何东西,类和方法调用也是完全相同的。此外,“objective-c”标签不如 Java 或 C# 活跃,几乎所有查看此标签的人都对 Mac 或 iPhone 编程感兴趣。
  • 您阅读了未经编辑的问题吗?它没有提及 Cocoa,因此进行了编辑和评论。我认为区分是很重要的,就像人们应该区分 C++ 和 STL、C# 和 .NET 等一样。
  • 我不确定我是否在编辑之前看到它,(有没有办法查看问题的修订?),我可以理解他的问题的答案是 Cocoa 特定的.但是,我猜 95% 以上的 Cocoa 开发人员使用的是 Objective-C,并且所有 Objective-C 开发人员中的 99% 以上都在使用 Cocoa(与 GNUstep 等相反)。这两个标签密切相关,我没有想到使用 Objective-C 进行标签会激怒不使用 Cocoa 的语言的粉丝。如果我在这方面完全错了,那么删除 Objective-C 标记是没有问题的。 :-)
  • 这是问题的标题,而不是标签。 Objective-c 和 cocoa 标签非常适合这个问题,但是在没有任何参考 Cocoa 的情况下,我本可以提供一个 POSIX 解决方案,并且它符合问题的标准。大多数 Cocoa 开发人员都在使用 Objective-C,而大多数 Objective-C 开发人员也在使用 Cocoa,但这没有理由互换使用这两个术语。

标签: objective-c cocoa nsdate nscalendar nsdatecomponents


【解决方案1】:

我一直在做:

NSDateFormatter* theDateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[theDateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[theDateFormatter setDateFormat:@"EEEE"];
NSString *weekDay =  [theDateFormatter stringFromDate:[NSDate date]];

这还有一个额外的好处是让您可以选择返回工作日的方式(通过更改 setDateFormat: 调用中的日期格式字符串

更多信息请访问:

http://developer.apple.com/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369

【讨论】:

    【解决方案2】:

    您可以查看 NSDate 和 NSCalendar 类。 例如,here 和 here

    他们提供以下代码:

    NSDate *today = [NSDate date];
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *weekdayComponents =
                    [gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];
    NSInteger day = [weekdayComponents day];
    NSInteger weekday = [weekdayComponents weekday];
    

    【讨论】:

      【解决方案3】:

      使用 NSCalendar 和 NSDateComponents。如 NSDateComponents 文档所示:

      NSCalendar *gregorian = [[NSCalendar alloc]
      initWithCalendarIdentifier:NSGregorianCalendar];
      NSDate *date = [gregorian dateFromComponents:comps];
      NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:date];
      int weekday = [weekdayComponents weekday];
      

      【讨论】:

      • “comps”从何而来?此外,从技术上讲,@ThisThib 是正确的 -weekday 返回一个 NSInteger 值。对于我所知道的任何日历来说都不应该是问题,但是以正确性和可移植性的名义...... ;-)
      【解决方案4】:

      这就是我最终得到的结果,它完全符合预期。它需要一个日期,将日期更改为该月的第一天,并获取该日期的天:

          NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
      NSDateComponents *monthDateComponents = [[NSCalendar currentCalendar] components: NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear |
                                               NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate: date];
      
      //  build date as start of month
      monthDateComponents.year = components.year;
      monthDateComponents.month = components.month;
      monthDateComponents.day = 1;
      
      NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
      //    [gregorian setFirstWeekday:1];
      
      NSDate *builtDate =[gregorian dateFromComponents: monthDateComponents];
      //    NSDateComponents *weekdayComponents =[gregorian components: NSCalendarUnitWeekday fromDate: builtDate];
      
      NSDateFormatter *df = [NSDateFormatter new];
      [df setDateFormat:@"E"];
      
      NSString *firstDay = [df stringFromDate:builtDate];
      if([firstDay isEqual:@"Sun"])  //  do for the other 6 days as appropriate
          return 7;
      

      【讨论】:

        猜你喜欢
        • 2015-10-10
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        相关资源
        最近更新 更多