【问题标题】:Get first day of week and last day in objective-c在objective-c中获取一周的第一天和最后一天
【发布时间】:2015-10-11 10:23:48
【问题描述】:

我想为每个人获取具有特定语言环境的本周的第一天。 例如,美国的一周从星期日开始,而其他国家/地区从星期一开始。

我想从星期一开始,这是因为我想将它用于 SQLQuery。

我有这个:

NSDate *weekDay = [NSDate date]; //any date in the week in which to calculate the first or last weekday   
 NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:weekDay];
[components setDay:([components day]-([components weekday]-[[NSCalendar currentCalendar] firstWeekday]))];

NSDate *firstWeekday = [gregorian dateFromComponents:components];
NSDate *lastWeekday = [[gregorian dateFromComponents:components] dateByAddingTimeInterval:7 * 24 * 3600 - 1];
NSLog(@"first - %@ \nlast - %@", firstWeekday, lastWeekday);

如果在您的语言环境中周从星期一开始但如果从星期日开始不返回我想要的,这很好。

所以想象今天是 2015 年 10 月 11 日 周日语言环境将返回第 11 周的第一天,最后一天,17 星期一语言环境将返回第 5 周的第一天,最后一天 11

我想在我的应用程序执行时返回第二个选项。

谢谢。 最好的问候。

【问题讨论】:

  • 作为一个英国人,我的一周从星期一开始......
  • 已更新,对美国有影响,但问题是一样的...
  • 您是否尝试将日历的语言环境设置为 systemLocale 或设置 firstWeekday?
  • 我想要的是不要使用 systemLocale 来防止第一天是星期日的语言环境。
  • 文档说:当您不想要任何本地化时,请使用系统区域设置。使用当前语言环境来格式化您向用户显示的文本。

标签: objective-c nsdate locale nsdateformatter nsdatecomponents


【解决方案1】:
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

cal.firstWeekday = 2;// set first week day to Monday
// 1: Sunday, 2: Monday, ..., 7:Saturday

NSDate *now = [NSDate date];
NSDate *startOfTheWeek;
NSDate *endOfWeek;
NSTimeInterval interval;
[cal rangeOfUnit:NSCalendarUnitWeekOfYear
       startDate:&startOfTheWeek
        interval:&interval
         forDate:now];
//startOfTheWeek holds the beginning of the week

endOfWeek = [startOfTheWeek dateByAddingTimeInterval:interval - 1];
// endOfWeek now holds the last second of the last week day

[cal rangeOfUnit:NSCalendarUnitDay
       startDate:&endOfWeek
        interval:NULL
         forDate:endOfWeek];
// endOfWeek now holds the beginning of the last week day

测试:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateStyle = NSDateFormatterShortStyle;
formatter.timeStyle = NSDateFormatterShortStyle;

NSLog(@"start: %@", [formatter stringFromDate:startOfTheWeek]);
NSLog(@"end:   %@", [formatter stringFromDate:endOfWeek]);

打印

start: 12.10.15, 00:00
end:   18.10.15, 00:00

所以星期一是一周的开始

如果我设置了

cal.firstWeekday = 1;

它会打印出来

start: 11.10.15, 00:00
end:   17.10.15, 00:00

星期天是一周的第一天

【讨论】:

  • 嗨:谢谢,但不幸的是,如果今天是周日 11 并且您执行代码,系统会返回一周的第一天是周日 11 而不是周一 5
  • 确定,打印出来的不是时区问题?
  • 例如:我在GMT+2,现在是1:12。一周开始我收到2015-10-11 22:00:00 +0000,因为这是格林威治标准时间。如果我添加 2 小时,则为 2015-10-12 00:00:00
  • @Miguel,如果有用,请接受我的回答。并对您的其他问题做同样的事情,因为您没有接受一个答案!
猜你喜欢
  • 2021-07-21
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
相关资源
最近更新 更多