【问题标题】:Objective-C/iOS: Get date for specific day in week (sunday)Objective-C / iOS:获取一周中特定日期(星期日)的日期
【发布时间】:2013-12-29 09:22:00
【问题描述】:

我需要获取当前一周中特定日期(星期日)的日期。我使用这个日期来确定是否应该进行每周重置,并且我对最后一次重置日期进行一些计算是在星期日日期之前等。这原则上已被多次询问和回答,并且我的解决方案在过去 6 个月内一直有效。但是今天,2013 年 12 月 29 日,它停止了工作。

目前使用的函数:

+ (NSDate *) getSundaysDate{
    NSDate *currentDate  = [NSDate date];
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    [gregorian setFirstWeekday:1];

    NSDateComponents *components = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSWeekCalendarUnit)  fromDate:currentDate];

    NSDateComponents *dt = [[NSDateComponents alloc]init];
    [dt setWeek:[components week]];
    [dt setWeekday:1];
    [dt setMonth:[components month]];
    [dt setYear:[components year]];

    return [gregorian dateFromComponents:dt];
}

这曾经像一个魅力,但今天,在我的应用程序上,它返回:

NSLog(@"sundaysDate %@", [Util getSundaysDate]);
sundaysDate 2012-12-29 23:00:00 +0000
NSLog(@"Current date %@", [[NSDate date] debugDescription]);
Current date 2013-12-29 11:37:23 +0000

注意 2012 年。

我知道这个问题已经在不同的情况下得到了多次回答,所以我提前道歉,但我根本没有得到 2012 年。

编辑 - 只是为了阐明所需的功能:

星期从星期日开始(第 1 天)

周六结束(第 7 天)

给定当前日期,我需要一周的第一天的日期。

Example 1: today is 29th December 2013
Expected: Sunday is 29th December 2013

Example 2: today is 4th January 2014
Expected: Sunday was 29th December 2013

Example 2: today is 8th January 2014
Expected: Sunday was 5th January 2014

【问题讨论】:

  • 这里没有复制。你在什么系统上运行?
  • 丹麦本地化,在 Mavericks 和 iPhone5 iOS 7 上测试模拟器。在模拟器和 iPhone 上的结果相同。我猜这与 2013 年的第一周(第 1 周)有关,实际上是在 2012 年。
  • 我可以重现这个。德语语言环境,iOS 7 Sim 中 Mav 上的 Xcode 5.0.2。猜猜我们有针对 Apple 的错误报告
  • 尝试将运行 iOS 6 的测试设备设置为英语本地,使用美国作为区域格式,结果相同。
  • 你还能登录currentDate吗?

标签: ios objective-c nsdate nscalendar nsdatecomponents


【解决方案1】:

我认为您需要使用 WeekOfMonth 而不是 Week
NSWeekCalendarUnit 基本上是一年中的一周,因此指定它和月份是有冲突的。

请注意,NSWeekCalendarUnit 已过时:

弃用声明
请改用weekOfYearweekOfMonth,具体取决于您的意图。

NSDate *currentDate  = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setFirstWeekday:1];

NSDateComponents *components = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit)  fromDate:currentDate];
[components setWeekday:1];

NSDate *sundatsData = [gregorian dateFromComponents: components];
NSLog(@"sundaysDate: %@", sundatsData);

NSLog 输出:

星期日日期:2013-12-29 05:00:00 +0000

【讨论】:

  • 在我的系统上产生“2013-11-30 23:00:00 +0000”,预计日期是“2013-12-29 23:00:00 +0000”。
  • Opps,有一个错字,应该是:[dt setWeekOfMonth:[components weekOfMonth]]; ,已修复。
  • [dt setWeekOfMonth:[组件 weekOfMonth]]; - 完美的。这看起来好多了。让我彻底测试并更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多