【问题标题】:Objective-C: Create week-day-number to name mappingObjective-C:创建工作日数字到名称映射
【发布时间】:2015-08-31 18:59:47
【问题描述】:

开始编辑

好吧,显然我没有说清楚。

  1. 我需要一个“星期的第一天”独立的双向映射星期几。因此,尽管用户可能会更改他/她的区域设置/区域设置,但存储的日期数仍可用于识别“正确”的日期。

  2. 我知道NSDateFormatterNSCalendarweekdaySymbols 方法。 但我在 API/Apple 文档中找不到返回数组的索引与 NSDateComponents' weekday 属性中的值之间的任何记录直接关系。 是的,有很多的帖子(这里和其他地方)像[NSCalendar weekdaySymbols][dateComps.weekday - 1](甚至[NSCalendar weekdaySymbols][dateComps.weekday])。但是,除了我在将日期 ID 映射回实际 NSDateComponents 的工作日时遇到问题(参见原始帖子中的第二个代码 sn-p),我更愿意在将项目移交给客户之前确定.

  3. 我遇到的第一个代码 sn-p(发布在我的原始帖子中)的问题是 NSCalendardateFromComponents: 不尊重传递的 NSDateComponents 实例的 weekday 属性.

编辑结束

您好,我正在尝试构建日期编号(例如 1 代表星期日)到日期名称(例如“星期日”)的映射。这样我就可以向用户显示日期列表(周一到周日或周日到周一或用户日历首选项之后的任何内容)。需要映射,以便我可以以独立于本地化的方式存储用户选择的天数。

我知道NSDateFormatterNSCalendarweekdaySymbols。但据我了解,这些只是列表,与用户的偏好(就一周的第一天而言)或 dayOfWeek (可能由 NSDateComponents 实例返回)无关),我不知道如何使用它们。

我尝试了几种方法....但总有一些东西把事情搞砸了。 例如,以下版本以 Monday 作为分配给dayName 的第一个值开始。但进一步的迭代似乎对日期没有影响。所以我得到了 7 个 Monday 字符串的列表。

    NSMutableArray *tempArray = [[NSMutableArray alloc] initWithCapacity:7];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDateComponents *dateComps = [[NSDateComponents alloc] init];

    NSDate *date = nil;
    NSString *dayName = nil;;

    NSDictionary *idToNameDict = nil;
    NSInteger weekday = [cal firstWeekday];

    for (NSInteger i = 0; i < 7; i++) {

        dateComps.weekday = weekday;
        date = [cal dateFromComponents:dateComps];

        dayName = [dateFormatter stringFromDate:date];

        idToNameDict = [NSDictionary dictionaryWithObject:dayName forKey:@( dateComps.weekday )];

        [tempArray addObject:idToNameDict];

        weekday++;
        if (weekday > 7) {
            weekday = 1;
        }
    }

简而言之,我有以下要求:

  • 一周中各天的用户日历相关表示(一周开始/结束)
  • 以非本地化的方式保存用户选择的日期(类似于 day-ID
  • 如果“匹配”用户之前选择的日期之一,请检查哪个日期。

我确实错过了一些东西。但我似乎找不到丢失的部分。 在我只使用 weekdaySymbols 并将 1 添加到元素索引以将 day-ID 映射到名称之前。但是下面的代码帽子例如weekday,周二的值为 2,而在构建列表时,周二与 3 相关联。

NSDate *givenDate = ...; // from somewhere
NSInteger userSelectedDay = ...; // from data store
NSDateComponents *comps = [[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:givenDate];
if (comps.weekday == userSelectedDay) {
    // highlight or whatever    
}

这可能与时区“东西”有关,但由于我从未设置(或删除)时区,所以我看不到如何/在哪里。

【问题讨论】:

  • 我完全不清楚你在问什么。 weekdaySymbols 已经并且始终是从工作日编号到名称的映射。它不会随日历的firstWeekday 而改变。
  • WRT 更新后的问题点:3:来自 Apple 文档 NSCalendar dateFromComponents:“忽略不必要的组件(例如,Day 优先于 Weekday 和 Weekday 序数)。”无法在给定工作日的情况下创建日期,有多种日期可能,日期默认为 1。

标签: ios objective-c nscalendar nsdatecomponents


【解决方案1】:

注意事项:

使用的时区是创建数据时的用户。
星期日 == 1

某个日期的工作日编号:

NSDate *date = [NSDate date];

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *dateComponents = [calendar components:NSWeekdayCalendarUnit fromDate:date];
NSInteger weekdayNumber = dateComponents.weekday;

日期的日期名称:

NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.dateFormat = @"EEEE";
NSString *dayName = [dateFormatter stringFromDate:date];

数字中的星期名称:

NSArray *weekDayNames = [[NSDateFormatter new] weekdaySymbols];
NSString *weekDayName = weekDayNames[2];

【讨论】:

  • 感谢@zaph 提供的示例。但正如我所说,我知道weekdaySymbols。我的代码 sn-ps 也表明我知道NSDateFormatterNSCalendar and NSDateComponents` 类及其用法。我已经更新了我的帖子,以便(希望)更清楚地了解我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 2010-11-13
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多