如何获取 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);
在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);