У меня есть требование, если я назову конкретную дату, например:

  1. Введите 2016-02-01, должен вернуть 2016-2-1, означает, что 2016-02-01 принадлежит первой неделе февраля 2016 года.

  2. Введите 2016-09-01, должен вернуть 2016-8-5, означает, что 2016-09-01 принадлежит пятой неделе августа 2016 года.

  3. Если 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);
}
-1
lme 7 Фев 2017 в 12:01
Можете ли вы поделиться с нами своим текущим кодом или тем, что вы пробовали?
 – 
viral
7 Фев 2017 в 12:21
App Dev, я публикую свой код в своем вопросе, сначала я использую NSCalender, но обнаружил, что он не соответствует моим требованиям.
 – 
lme
7 Фев 2017 в 12:43

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

1
Vijay Masal 7 Фев 2017 в 12:26
Извините, чувак, мой тест - это ваш ход мыслей , но вы посмотрите на мой код, и если я введу @"2016-04-02", он напечатает 2016-4-1, но это должно быть 2016-03-weekOf03. См. Мое требование.
 – 
lme
7 Фев 2017 в 12:42
Вы видите мое внимание и мой код VC. мой код Util похож на ваш ответ, я ясно дал понять, что NSCalendar не соответствует моему вопросу в моем сообщении, поэтому я еще жду ответа.
 – 
lme
7 Фев 2017 в 13:08
FormatDateStr находится в строковом формате, и это только формат даты, а не формат даты и времени, который выводится неправильно, вам нужно преобразовать formatDateStr в формат даты и времени, а после этого строкового формата в дату, и вы получите правильный вывод
 – 
Vijay Masal
7 Фев 2017 в 13:26
FormatDateStr = @ "2016-02-01 12:53:58 +0000"; как это
 – 
Vijay Masal
7 Фев 2017 в 13:27
Пожалуйста, проверьте дату, установленную для NSDateComponents, я думаю, что дата неправильная
 – 
Vijay Masal
7 Фев 2017 в 13:37
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), чтобы проверить неделю.

0
Prissy Eve 7 Фев 2017 в 12:19
Режим формулы - с понедельника по воскресенье.
 – 
lme
7 Фев 2017 в 12:24