如何获取 ISO-8601 GMT/UTC 年周数
Posted
技术标签:
【中文标题】如何获取 ISO-8601 GMT/UTC 年周数【英文标题】:How To Get ISO-8601 GMT/UTC Week Number of Year 【发布时间】:2016-05-02 16:44:48 【问题描述】:在 Objective C 中,我如何获取 GMT/UTC 日期并应用 ISO-8601 规则来获取周数?
当使用gmdate('W')
语句时,php 会以 ISO-8601 格式生成一年中的星期数。但是,当您尝试仅获取 GMT/UTC 日期并获取周数时,这在 Objective C 中不匹配,因为它不是以 ISO-8601 方式进行的。以下是 PHP 文档中关于带有 'W'
参数的 ISO-8601 的说明:
"
W
: ISO-8601 周数,周数从星期一开始" [强调我的]
因此,当我查看 2016 年的日历时,如果我忽略“从星期一开始”规则,则 1 月 26 日在第 5 周,如果我考虑到该规则,则在第 4 周。
比较这两个例子,一个在 PHP 中,另一个在 Objective C 中,你会得到两个不同的结果:
目标 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:48。 Objective C 发出 05
,而 PHP 发出 04
。
【问题讨论】:
【参考方案1】: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);
【讨论】:
我不得不将 NSInteger 切换为 long,但除此之外它还有效。你知道如何使用 NSDateFormatter 来使用 %W 制作两位数的版本吗? 非常感谢。当我获得许可时,我会将其标记为最佳答案。 @Volomike 如果您编辑了我的答案,请使用正确的格式说明符(unsigned int
是 %u
)。
啊,没想到。我会这样做的。【参考方案2】:
我无法完全弄清楚 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 + \0 for C strings
time( &rawtime );
t = gmtime(&rawtime);
strftime(b,3,"%W",t);
NSString *sWeekNum = [NSString stringWithFormat:@"%s",b];
这也确保它是 2 位数字。因此,不必为了使其与 PHP 版本匹配而执行额外的步骤。
【讨论】:
以上是关于如何获取 ISO-8601 GMT/UTC 年周数的主要内容,如果未能解决你的问题,请参考以下文章