iPhone NSCalendar - неверный календарь для пользователей за пределами США - PullRequest
0 голосов
/ 17 марта 2011

После попытки поработать над чужим кодом и стольких разных итераций я не могу понять, что я делаю неправильно с датами в представлении календарного месяца. Я пытаюсь представить календарь в виде месяца, например calendar.app, но, к сожалению, некоторые пользователи в таких странах, как Австралия и Великобритания, сообщают о неправильном сопоставлении дней с датами. Например, в Австралии 17 марта отображается как пятница. Любая помощь высоко ценится!

Вот пример кода, который я использую:

-(void)setCalendar
{
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *comps = [gregorian components:units fromDate:[NSDate date]];
    self.currentDate = [gregorian dateFromComponents:comps];
    NSInteger weekdayInteger=[comps weekday];
    currentMonth=[comps month]; 
    currentYear=[comps year];   
    NSString *dateString=[[NSString stringWithFormat:@"%@",currentDate] substringToIndex:10];
    NSArray *array= [dateString componentsSeparatedByString:@"-"];
    NSInteger currentDay=[[array objectAtIndex:2] intValue];
    currentMonthConstant=currentMonth;
    currentYearConstant=currentYear;
    currentDayConstant=currentDay;
    currentConstantDate=[NSString stringWithFormat:@"%d/%d/%d",currentDayConstant,currentMonthConstant,currentYearConstant];
    currentFirstDay=((8+weekdayInteger-(currentDay%7))%7);
    if(currentFirstDay==0)
        currentFirstDay=7;
    [gregorian release];
}

А вот как я заполняю календарь:

-(void)fillCalender:(NSInteger)month weekStarts:(NSInteger)weekday year:(NSInteger)year
{

    currentMonth=month;
    currentYear=year;
    currentFirstDay=weekday;
    UIButton *temp;
    NSInteger numberOfDays=[self getNumberofDays:month YearVlue:year];
    currentLastDay=(currentFirstDay+numberOfDays-1)%7;
    if(currentLastDay==0)
        currentLastDay=7;
    NSString *monthName=[self getMonth:month];
    NSInteger grid=(weekday-1); 

    monthLabel.text=[NSString stringWithFormat:@"%@   %d",monthName,year];


    for(int i=1;i<=numberOfDays;i++)
    {
        if([frontView isEqualToString:@"view1"])
            temp=[arr_View2Buttons objectAtIndex:grid];
        else
            temp= [arr_View1Buttons objectAtIndex:grid];

        [temp setBackgroundImage:nil forState:UIControlStateNormal];

        [temp setUserInteractionEnabled:TRUE];
        UILabel *aLbl = (UILabel *)[temp viewWithTag:123];
        [aLbl setText:[NSString stringWithFormat:@"%d",i]];

        // check for today
        if(currentDayConstant == i && currentMonthConstant == currentMonth && currentYearConstant == currentYear)
        {
            [aLbl setTextColor:[UIColor blueColor]];
        }
        else
        {
            [aLbl setTextColor:[UIColor colorWithRed:69/255.0 green:2/255.0 blue:71/255.0 alpha:1.0]];
        }
        [temp setTag:i];

        grid++;
        if(grid==35)
            grid=0;
    }

}

И, наконец, viewdidload:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setCalendar];
    // set views
    [self.view1 setFrame:CGRectMake(0,45,320,232)];
    [self.view2 setFrame:CGRectMake(0,277,320,232)];
    [self.view addSubview:self.view1];
    [self.view addSubview:self.view2];
    frontView = @"view2";
    [self fillCalender:currentMonth weekStarts:currentFirstDay year:currentYear];
    frontView = @"view1";
}

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Вы используете NSDateComponents, чтобы получить день недели, месяц и год.Это нормально.
Но затем вы используете манипуляции со строками, чтобы получить день.
И вы манипулируете строкой, которую вы получаете из метода описания NSDate.И из моего опыта этот метод возвращает все, что хочет.Я никогда не мог понять, какое смещение часового пояса использует метод описания, на моей машине он возвращает NSDate в часовом поясе UTC, другие пользователи задавали вопросы о SO, которые подразумевают, что этот метод возвращает NSDate в местном часовом поясе или в часовом поясе, который являетсярядом с местным часовым поясом.Или в произвольном часовом поясе.Обычно это не проблема, потому что вы можете использовать информацию о часовом поясе, но вы просто игнорируете ее.

Короче говоря: Не используйте обработку строк, если вам нужна обработка дат

ИМХО, это проблема часового пояса.Потому что вы смешиваете два разных способа обработки даты и игнорируете часовой пояс.
Избавьтесь от части манипулирования строками и используйте NSDateComponents для всего.

0 голосов
/ 17 марта 2011

Вам необходимо изменить код

заменить NSCalendar * gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];

с

NSCalendar * currentCalendar = [NSCalendar currentCalendar];

это идентифицирует текущий календарь с устройства и будет работать соответственно

Надеюсь, это решит вашу проблему ...

...