У меня есть требование, если я назову конкретную дату, например:
Введите
2016-02-01
, должен вернуть2016-2-1
, означает, что2016-02-01
принадлежит первой неделе февраля2016
года.Введите
2016-09-01
, должен вернуть2016-8-5
, означает, что2016-09-01
принадлежит пятой неделе августа2016
года.Если
2016-01-01
не понедельник, год возврата должен быть2015-x-x
.
Внимание , там режим формулы с понедельника по воскресенье неделя. Например, 2016-04
, 2016-04-04
-> 2016-04-10
- первая неделя апреля. 2016-04-01
-> 2016-04-03
не относится к неделям апреля, это относится к марту.
Я пробовал использовать NSCalendar, но это особенное требование, я понятия не имею, как с ним справиться, так что кто-нибудь может предложить какие-то мысли по этому поводу?
Заранее спасибо.
Мой проверенный код:
В моем Util.m:
+ (NSString *)getCustomMonthAndWeek:(NSString *)formatDateStr {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSDate *date= [[NSDate alloc] init];
date = [formatter dateFromString:formatDateStr];
NSCalendar *calen = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *dateCom = [calen components:(NSCalendarUnitYear | NSCalendarUnitMonth |NSCalendarUnitWeekOfMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:date];
NSString *ret_str = @"";
ret_str = [[NSString alloc] initWithFormat:@"%ld-%ld-%@", (long)dateCom.year, (long)dateCom.month, dateCom.weekOfMonth];
return ret_str;
}
В моем ВК:
- (void)viewDidLoad {
[super viewDidLoad];
NSString *string = [Util getCustomMonthAndWeek:@"2016-04-02"]; // Here prints 2016-4-1, is not my requirement, you see my Attention.
NSLog(@"%@", string);
}
2 ответа
Используя NSCalendar, установленный на NSDateComponents, вы обнаружите, что указанная дата - это месяц, неделя. используйте следующий код
NSDate *date=[NSDate date];
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *dateComponents = [gregorianCalendar components:(NSCalendarUnitYear | NSCalendarUnitMonth |NSCalendarUnitWeekOfMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:date];
Компоненты выдают результат Календарный год: 2017 Месяц: 2 Високосный месяц: нет День: 7 Час: 14 Минуты: 55 Неделя месяца: 2
@"2016-04-02"
, он напечатает 2016-4-1
, но это должно быть 2016-03-weekOf03
. См. Мое требование.
NSDate *someDate = // whatever
NSDate *now = [NSDate date];
NSDateComponents *thenComponents = [[NSCalendar currentCalendar] components:NSHourCalendarUnit|NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:someDate];
NSDateComponents *nowComponents = [[NSCalendar currentCalendar] components:NSHourCalendarUnit|NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:now];
if([thenComponents year] == [nowComponents year] && [thenComponents month] == [nowComponents month] && [thenComponents day] == [nowComponents day] && [thenComponents hour] == [nowComponents hour])
{ }
Удалите компонент «час», если вы просто хотите проверить день, или удалите и его, и «день» (и замените на NSWeekCalendarUnit и метод -week), чтобы проверить неделю.
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.