【发布时间】:2015-08-31 18:59:47
【问题描述】:
开始编辑
好吧,显然我没有说清楚。
我需要一个“星期的第一天”独立的双向映射星期几。因此,尽管用户可能会更改他/她的区域设置/区域设置,但存储的日期数仍可用于识别“正确”的日期。
我知道
NSDateFormatter和NSCalendar的weekdaySymbols方法。 但我在 API/Apple 文档中找不到返回数组的索引与NSDateComponents'weekday属性中的值之间的任何记录直接关系。 是的,有很多的帖子(这里和其他地方)像[NSCalendar weekdaySymbols][dateComps.weekday - 1](甚至[NSCalendar weekdaySymbols][dateComps.weekday])。但是,除了我在将日期 ID 映射回实际NSDateComponents的工作日时遇到问题(参见原始帖子中的第二个代码 sn-p),我更愿意在将项目移交给客户之前确定.我遇到的第一个代码 sn-p(发布在我的原始帖子中)的问题是
NSCalendar的dateFromComponents:不尊重传递的NSDateComponents实例的weekday属性.
编辑结束
您好,我正在尝试构建日期编号(例如 1 代表星期日)到日期名称(例如“星期日”)的映射。这样我就可以向用户显示日期列表(周一到周日或周日到周一或用户日历首选项之后的任何内容)。需要映射,以便我可以以独立于本地化的方式存储用户选择的天数。
我知道NSDateFormatter 或NSCalendar 的weekdaySymbols。但据我了解,这些只是列表,与用户的偏好(就一周的第一天而言)或 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