首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSCalendar -自定义日历

NSCalendar -自定义日历
EN

Stack Overflow用户
提问于 2012-05-12 22:31:09
回答 1查看 4K关注 0票数 3

在Mac OS X上,如果你去系统偏好设置>日期和时间>打开语言和文本>在顶部点击格式>,然后在日历的下拉列表中有一个用于科普特日历的选项。如何在Mac应用程序中显示此日历?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-12 23:38:58

如何在Mac应用程序中显示此日历?

那么,你说的展示是什么意思?你只是想在计算中使用科普特历法吗?如果是这样的话,您所需要的就是一个合适的NSCalendar实例。由于NSCalendar (和朋友)是由重症监护室支持的,你可以使用任何identifier that ICU supports (在“键/类型定义”下)。这意味着您可以从以下各项中进行选择:

  • gregorian - (default)
  • islamic -天文Arabic
  • chinese -繁体中文calendar
  • islamic-civil -民用(算法)阿拉伯语calendar
  • hebrew -传统希伯来语Calendar
  • japanese -英制日历(除年份外与公历相同,每个Emperor)
  • buddhist -泰式佛教日历与公历相同(除year)
  • persian -波斯Calendar
  • coptic -科普特Calendar
  • ethiopic -埃塞俄比亚日历

外与公历相同

因此,要获取NSCalendar实例,需要执行以下操作:

代码语言:javascript
复制
NSCalendar *coptic = [[NSCalendar alloc] initWithCalendarIdentifier:@"coptic"];

然而,如果你真的想要绘制一些UI (如iCal),那么你需要更多的信息。幸运的是,您也可以从NSCalendar获得它。

例如,您需要知道日历有多少个月:

代码语言:javascript
复制
NSRange minMonthRange = [coptic minimumRangeOfUnit:NSMonthCalendarUnit]; // {1,13}
NSRange maxMonthRange = [coptic maximumRangeOfUnit:NSMonthCalendarUnit]; // {1,13}

所以看起来每年都有13个月。好的,那么一个月中的几天呢?

代码语言:javascript
复制
NSRange minDayRange = [coptic minimumRangeOfUnit:NSDayCalendarUnit]; // {1,5}
NSRange maxDayRange = [coptic maximumRangeOfUnit:NSDayCalendarUnit]; // {1,30}

哇哦!看起来你可以有一个只有5天的月份!(但没有超过30天的月份)让我们看看是否可以找到更多:

代码语言:javascript
复制
NSDateComponents *firstDayOfMonth = [[NSDateComponents alloc] init];
[firstDayOfMonth setDay:1];
for (NSInteger y = 1500; y < 1520; ++y) {
    [firstDayOfMonth setYear:y];
    for (NSInteger m = 1; m <= 13; ++m) {
        [firstDayOfMonth setMonth:m];

        NSDate *date = [coptic dateFromComponents:firstDayOfMonth];

        NSRange rangeOfDaysInMonth = [coptic rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
        NSLog(@"%d - %d => %@", y, m, NSStringFromRange(rangeOfDaysInMonth));
    }
}

这将迭代20年,并构建一个与每年每个月的第一天相对应的NSDate。然后,它查看该月有多少天,并记录结果。(请注意,15001520是我任意选择的年份)

这记录了:

代码语言:javascript
复制
1500 - 1 => {1, 30}
1500 - 2 => {1, 30}
1500 - 3 => {1, 30}
1500 - 4 => {1, 30}
1500 - 5 => {1, 30}
1500 - 6 => {1, 30}
1500 - 7 => {1, 30}
1500 - 8 => {1, 30}
1500 - 9 => {1, 30}
1500 - 10 => {1, 30}
1500 - 11 => {1, 30}
1500 - 12 => {1, 30}
1500 - 13 => {1, 5}
1501 - 1 => {1, 30}
1501 - 2 => {1, 30}
1501 - 3 => {1, 30}
1501 - 4 => {1, 30}
1501 - 5 => {1, 30}
1501 - 6 => {1, 30}
1501 - 7 => {1, 30}
1501 - 8 => {1, 30}
1501 - 9 => {1, 30}
1501 - 10 => {1, 30}
1501 - 11 => {1, 30}
1501 - 12 => {1, 30}
1501 - 13 => {1, 5}
1502 - 1 => {1, 30}
1502 - 2 => {1, 30}
1502 - 3 => {1, 30}
1502 - 4 => {1, 30}
1502 - 5 => {1, 30}
1502 - 6 => {1, 30}
1502 - 7 => {1, 30}
1502 - 8 => {1, 30}
1502 - 9 => {1, 30}
1502 - 10 => {1, 30}
1502 - 11 => {1, 30}
1502 - 12 => {1, 30}
1502 - 13 => {1, 5}
1503 - 1 => {1, 30}
1503 - 2 => {1, 30}
1503 - 3 => {1, 30}
1503 - 4 => {1, 30}
1503 - 5 => {1, 30}
1503 - 6 => {1, 30}
1503 - 7 => {1, 30}
1503 - 8 => {1, 30}
1503 - 9 => {1, 30}
1503 - 10 => {1, 30}
1503 - 11 => {1, 30}
1503 - 12 => {1, 30}
1503 - 13 => {1, 6}
1504 - 1 => {1, 30}
1504 - 2 => {1, 30}
1504 - 3 => {1, 30}
1504 - 4 => {1, 30}
1504 - 5 => {1, 30}
1504 - 6 => {1, 30}
1504 - 7 => {1, 30}
1504 - 8 => {1, 30}
1504 - 9 => {1, 30}
1504 - 10 => {1, 30}
1504 - 11 => {1, 30}
1504 - 12 => {1, 30}
1504 - 13 => {1, 5}
1505 - 1 => {1, 30}
1505 - 2 => {1, 30}
1505 - 3 => {1, 30}
1505 - 4 => {1, 30}
1505 - 5 => {1, 30}
1505 - 6 => {1, 30}
1505 - 7 => {1, 30}
1505 - 8 => {1, 30}
1505 - 9 => {1, 30}
1505 - 10 => {1, 30}
1505 - 11 => {1, 30}
1505 - 12 => {1, 30}
1505 - 13 => {1, 5}
1506 - 1 => {1, 30}
1506 - 2 => {1, 30}
1506 - 3 => {1, 30}
1506 - 4 => {1, 30}
1506 - 5 => {1, 30}
1506 - 6 => {1, 30}
1506 - 7 => {1, 30}
1506 - 8 => {1, 30}
1506 - 9 => {1, 30}
1506 - 10 => {1, 30}
1506 - 11 => {1, 30}
1506 - 12 => {1, 30}
1506 - 13 => {1, 5}
1507 - 1 => {1, 30}
1507 - 2 => {1, 30}
1507 - 3 => {1, 30}
1507 - 4 => {1, 30}
1507 - 5 => {1, 30}
1507 - 6 => {1, 30}
1507 - 7 => {1, 30}
1507 - 8 => {1, 30}
1507 - 9 => {1, 30}
1507 - 10 => {1, 30}
1507 - 11 => {1, 30}
1507 - 12 => {1, 30}
1507 - 13 => {1, 6}
1508 - 1 => {1, 30}
1508 - 2 => {1, 30}
1508 - 3 => {1, 30}
1508 - 4 => {1, 30}
1508 - 5 => {1, 30}
1508 - 6 => {1, 30}
1508 - 7 => {1, 30}
1508 - 8 => {1, 30}
1508 - 9 => {1, 30}
1508 - 10 => {1, 30}
1508 - 11 => {1, 30}
1508 - 12 => {1, 30}
1508 - 13 => {1, 5}
1509 - 1 => {1, 30}
1509 - 2 => {1, 30}
1509 - 3 => {1, 30}
1509 - 4 => {1, 30}
1509 - 5 => {1, 30}
1509 - 6 => {1, 30}
1509 - 7 => {1, 30}
1509 - 8 => {1, 30}
1509 - 9 => {1, 30}
1509 - 10 => {1, 30}
1509 - 11 => {1, 30}
1509 - 12 => {1, 30}
1509 - 13 => {1, 5}
1510 - 1 => {1, 30}
1510 - 2 => {1, 30}
1510 - 3 => {1, 30}
1510 - 4 => {1, 30}
1510 - 5 => {1, 30}
1510 - 6 => {1, 30}
1510 - 7 => {1, 30}
1510 - 8 => {1, 30}
1510 - 9 => {1, 30}
1510 - 10 => {1, 30}
1510 - 11 => {1, 30}
1510 - 12 => {1, 30}
1510 - 13 => {1, 5}
1511 - 1 => {1, 30}
1511 - 2 => {1, 30}
1511 - 3 => {1, 30}
1511 - 4 => {1, 30}
1511 - 5 => {1, 30}
1511 - 6 => {1, 30}
1511 - 7 => {1, 30}
1511 - 8 => {1, 30}
1511 - 9 => {1, 30}
1511 - 10 => {1, 30}
1511 - 11 => {1, 30}
1511 - 12 => {1, 30}
1511 - 13 => {1, 6}
1512 - 1 => {1, 30}
1512 - 2 => {1, 30}
1512 - 3 => {1, 30}
1512 - 4 => {1, 30}
1512 - 5 => {1, 30}
1512 - 6 => {1, 30}
1512 - 7 => {1, 30}
1512 - 8 => {1, 30}
1512 - 9 => {1, 30}
1512 - 10 => {1, 30}
1512 - 11 => {1, 30}
1512 - 12 => {1, 30}
1512 - 13 => {1, 5}
1513 - 1 => {1, 30}
1513 - 2 => {1, 30}
1513 - 3 => {1, 30}
1513 - 4 => {1, 30}
1513 - 5 => {1, 30}
1513 - 6 => {1, 30}
1513 - 7 => {1, 30}
1513 - 8 => {1, 30}
1513 - 9 => {1, 30}
1513 - 10 => {1, 30}
1513 - 11 => {1, 30}
1513 - 12 => {1, 30}
1513 - 13 => {1, 5}
1514 - 1 => {1, 30}
1514 - 2 => {1, 30}
1514 - 3 => {1, 30}
1514 - 4 => {1, 30}
1514 - 5 => {1, 30}
1514 - 6 => {1, 30}
1514 - 7 => {1, 30}
1514 - 8 => {1, 30}
1514 - 9 => {1, 30}
1514 - 10 => {1, 30}
1514 - 11 => {1, 30}
1514 - 12 => {1, 30}
1514 - 13 => {1, 5}
1515 - 1 => {1, 30}
1515 - 2 => {1, 30}
1515 - 3 => {1, 30}
1515 - 4 => {1, 30}
1515 - 5 => {1, 30}
1515 - 6 => {1, 30}
1515 - 7 => {1, 30}
1515 - 8 => {1, 30}
1515 - 9 => {1, 30}
1515 - 10 => {1, 30}
1515 - 11 => {1, 30}
1515 - 12 => {1, 30}
1515 - 13 => {1, 6}
1516 - 1 => {1, 30}
1516 - 2 => {1, 30}
1516 - 3 => {1, 30}
1516 - 4 => {1, 30}
1516 - 5 => {1, 30}
1516 - 6 => {1, 30}
1516 - 7 => {1, 30}
1516 - 8 => {1, 30}
1516 - 9 => {1, 30}
1516 - 10 => {1, 30}
1516 - 11 => {1, 30}
1516 - 12 => {1, 30}
1516 - 13 => {1, 5}
1517 - 1 => {1, 30}
1517 - 2 => {1, 30}
1517 - 3 => {1, 30}
1517 - 4 => {1, 30}
1517 - 5 => {1, 30}
1517 - 6 => {1, 30}
1517 - 7 => {1, 30}
1517 - 8 => {1, 30}
1517 - 9 => {1, 30}
1517 - 10 => {1, 30}
1517 - 11 => {1, 30}
1517 - 12 => {1, 30}
1517 - 13 => {1, 5}
1518 - 1 => {1, 30}
1518 - 2 => {1, 30}
1518 - 3 => {1, 30}
1518 - 4 => {1, 30}
1518 - 5 => {1, 30}
1518 - 6 => {1, 30}
1518 - 7 => {1, 30}
1518 - 8 => {1, 30}
1518 - 9 => {1, 30}
1518 - 10 => {1, 30}
1518 - 11 => {1, 30}
1518 - 12 => {1, 30}
1518 - 13 => {1, 5}
1519 - 1 => {1, 30}
1519 - 2 => {1, 30}
1519 - 3 => {1, 30}
1519 - 4 => {1, 30}
1519 - 5 => {1, 30}
1519 - 6 => {1, 30}
1519 - 7 => {1, 30}
1519 - 8 => {1, 30}
1519 - 9 => {1, 30}
1519 - 10 => {1, 30}
1519 - 11 => {1, 30}
1519 - 12 => {1, 30}
1519 - 13 => {1, 6}

分析这一点,我们看到每个月有30天,除了13个月,(通常)有5天。似乎每4年一次,第13个月有6天。这一定是它处理闰日的方式。这确实是一个很好的日历!一切都很好很正常。

让我们来看看更多:

代码语言:javascript
复制
NSRange minHourRange = [coptic minimumRangeOfUnit:NSHourCalendarUnit]; // {0,24}
NSRange maxHourRange = [coptic maximumRangeOfUnit:NSHourCalendarUnit]; // {0,24}

因此,每天有24小时(夏令时跳跃不会反映在此范围内。公历还报告了{0,24}的最小小时范围和{0,24}的最大小时范围,尽管有些天有23小时或25小时,这取决于DST转换)。

在分钟和秒级别(每分钟和秒各60),情况也是正常的。

因此,如果您希望自己显示日历,则需要一个能够处理一年中13个月的UI,其中一个月的长度不到一周。在次日级别,事情是我们所习惯的。

当然,你也可以去看看科普特日历上的Wikipedia article

编辑(基于注释)

如果您想要做的只是将日期格式化为字符串,那么(当然)您将转向NSDateFormatter

代码语言:javascript
复制
NSDateFormatter *f = [[NSDateFormatter alloc] init];
NSCalendar *coptic = [[NSCalendar alloc] initWithCalendarIdentifier:@"coptic"];
[f setCalendar:coptic];
[f setDateStyle:NSDateFormatterLongStyle];

NSDate *rightNow = [NSDate date];
NSString *formattedDate = [f stringFromDate:rightNow];
NSLog(@"%@", formattedDate); // logs "Bashans 4, 1728"
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10564610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档