【问题标题】:Finding the locale-dependent first day of the week查找依赖于语言环境的一周的第一天
【发布时间】:2014-07-03 08:26:52
【问题描述】:

给定NSDate,在给定用户区域设置的情况下,我如何找到该日期所在周的第一天。例如,我听说有些国家将星期一视为一周的第一天,而其他国家则使用星期日。在第一种情况下,我需要返回前一个星期一,而在后一种情况下,我需要返回前一个星期日。

到目前为止,我的最大努力总是返回前一个星期日,无论应用的设备设置如何:

NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setLocale:[NSLocale currentLocale]];
NSDateComponents *components = [calendar components:NSYearForWeekOfYearCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit fromDate:originalDate];
[components setWeekday:1];
NSDate *firstDayOfWeek = [calendar dateFromComponents:components];

额外问题:在 iOS 上,是哪个设置驱动的?是“区域格式”吗?

【问题讨论】:

标签: ios objective-c cocoa-touch nsdate nsdatecomponents


【解决方案1】:

尝试改变:

[components setWeekday:1];

到:

[components setWeekday:[calendar firstWeekday]];

您还应该删除NSYearForWeekOfYearCalendarUnitNSWeekCalendarUnit 组件。

额外问题:“区域格式”应该是更改一周第一天的设置。

【讨论】:

  • 谢谢 - 我读到 NSYearForWeekOfYearCalendarUnit 和 NSWeekCalendarUnit 是处理像 1 月 2 日星期三这样的日期所必需的,其中前一个工作日是前一年的。我看看能不能找到出处。
  • @BenPackard 我承认我建议删除它们,因为这些似乎没有必要。我不确定。
【解决方案2】:

对于那些不想设置日历 firstWeekday 的人来说,这是一种更智能的老式方式。

NSDate *date = [NSDate dateWithTimeIntervalSince1970:1483620311.228]; 
NSLog(@"current date ===> : %@", date);
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *previousMonday = [calendar nextDateAfterDate:date 
                                    matchingUnit:NSCalendarUnitWeekday  
                                           value:2 //use 1-7 for Sunday to Saturday week day.
                                         options:NSCalendarMatchNextTime | NSCalendarSearchBackwards];
NSLog(@"previousMonday date ===> : %@", previousMonday); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多