在目标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中,你会得到两个不同的结果:
<?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";
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 = ""
}
。
答案 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版本匹配,我们不必执行额外的步骤。