如何获取 ISO-8601 GMT/UTC 年中的周数

How To Get ISO-8601 GMT/UTC Week Number of Year

在Objective C中,如何获取GMT/UTC日期并应用ISO-8601规则来获取周数?

当使用 gmdate('W') 语句时,

PHP 以 ISO-8601 格式生成一年中的周数。但是,当您尝试只获取 GMT/UTC 日期并获取周数时,这在 Objective C 中不匹配,因为它不是以 ISO-8601 方式进行的。以下是 PHP 文档对带有 'W' 参数的 ISO-8601 的描述:

"W: ISO-8601 week number of year, weeks starting on Monday" [emphasis mine]

因此,当我查看 2016 年的日历时,如果我不考虑 "starting on Monday" 规则,1 月 26 日是第 5 周,如果我考虑到该规则,1 月 26 日是第 4 周。

比较这两个例子,一个在PHP,另一个在Objective C,你会得到两个不同的结果:

Objective C

NSCalendar *calender = [NSCalendar currentCalendar];
NSDateComponents *dateComponent = [calender components:(NSWeekOfYearCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:[NSDate date]];
NSString *sWeekNum = [NSString stringWithFormat:@"%ld",(long)dateComponent.weekOfYear];
if ([sWeekNum length] < 2) {
  sWeekNum = [NSString stringWithFormat:@"0%ld",(long)dateComponent.weekOfYear];
}
NSLog(@"%@",sWeekNum);

PHP

<?php
error_reporting(E_ALL);
ini_set('display_errors','On');

// SET OUR TIMEZONE STUFF
try {
    $sTimeZone = 'GMT';
    if (function_exists('date_default_timezone_set')) {
        date_default_timezone_set($sTimeZone);
    } else {
        putenv('TZ=' .$sTimeZone);
    }
    ini_set('date.timezone', $sTimeZone);
} catch(Exception $e) {}
echo gmdate('W') . "\n";

例如,今天对我来说是 2016 年 1 月 26 日@1:48am EST。 Objective C 发出 05,而 PHP 发出 04

我无法完全找出 Objective C 中的解决方案。我不得不切换到 C/C++(在本例中为 C),这要求我将我的 .m 文件(我正在构建代码的地方)更改为 .mm 文件,以便我可以混合 C/C++ 和 Objective C,然后确保这是在项目设置中编译的。

#include <string>
#include <time.h>
//...and then, later on in the code...
time_t rawtime;
struct tm *t;
char b[3]; // 2 chars + [=10=] for C strings
time( &rawtime );
t = gmtime(&rawtime);
strftime(b,3,"%W",t);
NSString *sWeekNum = [NSString stringWithFormat:@"%s",b];

这也确保它是 2 位数字。因此,无需执行额外步骤即可使其与 PHP 版本相匹配。

NSCalendar可以初始化为ISO8601日历。

NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierISO8601];
unsigned int weekOfYear = (unsigned int)[calender component:NSCalendarUnitWeekOfYear fromDate: [NSDate date]];
NSString *sWeekNum = [NSString stringWithFormat:@"%02u",weekOfYear];
NSLog(@"%@", sWeekNum);