2016-01-26 3 views
0

В Objective C, как мне взять дату GMT/UTC и применить правило ISO-8601, чтобы получить номер недели?Как получить ISO-8601 GMT/UTC Week Number Год

PHP генерирует недельный номер года в формате ISO-8601, когда используется оператор gmdate('W'). Это, однако, не соответствует Objective C, когда вы пытаетесь просто взять GMT/UTC и получить номер недели, потому что это не делает это по ISO-8601. Вот что документация PHP говорит о ISO-8601 с 'W' параметра:

"W: ISO-8601 номер недели в году, недели, начиная с понедельника" [курсив мой]

Итак, когда я смотрю на свой календарь на 2016 год, 26 января выпадает на неделю 05, если я пренебрегаю этим правилом «начиная с понедельника» и падает на 04, если принять это правило.

Сравните эти два примера, один в 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"; 

Для Например, сегодня 26 января 2016 года, 1:48 утра EST для меня. Объект C испускает 05, а PHP испускает 04.

ответ

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

Мне пришлось переключать NSInteger на длинный, но не такой, какой он работал. Вы знаете, как использовать NSDateFormatter для использования% W для создания двухзначной версии? – Volomike

+0

Я обновил ответ – vadian

+0

Спасибо, кучка. Когда я получу разрешение, я отмечу это как лучший ответ. – Volomike

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.