如何获得ISO-8601 GMT / UTC周数

时间:2016-01-26 07:01:21

标签: objective-c utc iso8601 gmt week-number

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

当使用'W'语句时,PHP会以ISO-8601格式生成一年中的周数。但是,当您尝试仅获取GMT / UTC日期并获取周数时,这与目标C不匹配,因为它不以ISO-8601方式执行。以下是PHP文档中关于带有W参数的ISO-8601的说明:

  

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); :ISO-8601周数,周<星期一开始 [强调我的]

所以,当我查看2016年的日历时,如果我忽略“星期一开始”规则,1月26日会落在第05周,如果我考虑该规则,则会落在04年。

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

目标C

<?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";

PHP

05

例如,今天是2016年1月26日美国东部时间上午1:48。 Objective C发出04,而PHP发出 lass BaseTabBarViewController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() //The code below is the reason I get error for if let notif = (self.tabBar.items?[2])! as UITabBarItem { NotificationManager.sharedInstance.notifTabbar = notif }else{ // NotificationManager.sharedInstance.notifTabbar.badgeValue = "" }

2 个答案:

答案 0 :(得分:2)

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);

答案 1 :(得分:0)

我无法完全找出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版本匹配,我们不必执行额外的步骤。