iPhone nscalendar - calendario incorrecto dibujado para usuarios fuera de nosotros

StackOverflow https://stackoverflow.com/questions/5334185

  •  26-10-2019
  •  | 
  •  

Pregunta

Después de tratar de trabajar en el código de otra persona, y muchas iteraciones diferentes, no puedo entender qué estoy haciendo mal con las fechas en una vista del mes calendario. Estoy tratando de presentar un calendario en la moda de la vista mensual como el calendario. Por ejemplo, en Australia se muestra el 17 de marzo como el viernes. ¡Cualquier ayuda es muy apreciada!

Aquí está la muestra de código que estoy usando:

-(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];
}

Y así es como estoy llenando el calendario:

-(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;
    }

}

Y finalmente verdidload:

- (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";
}
¿Fue útil?

Solución

Necesitas cambiar el código

Reemplazar nscalendar *gregorian = [[nscalendar alloc] initwithCalendArdentifier: nsgregoriancalendar];

con

Nscalendar *currentCalendar = [nscalendar currentCalendar];

Esto identificará el calendario actual desde el dispositivo y funcionará en consecuencia

Espero que esto solucione tu problema...

Otros consejos

Usas NSDATecomponents para obtener el día de la semana, el mes y el año. Lo cual está bien.
Pero luego usa la manipulación de cadenas para obtener el día.
Y manipulas la cadena que obtienes del método de descripción de NSDate. Y desde mi experiencia, este método devuelve lo que quiera. Nunca podría averiguar en qué zona horaria compensan el método de descripción que utiliza, en mi máquina devuelve el NSDate en la zona horaria de UTC, otros usuarios han hecho preguntas para que este método devuelva el NSDATE en la zona horaria local o en una zona horaria que es. Junto a la zona horaria local. O en una zona horaria arbitraria. Por lo general, esto no es un problema porque puede usar la información de la zona horaria, pero simplemente la ignora.

Para acortar una historia larga: No use el procesamiento de cadenas si desea procesamiento de fecha

En mi humilde opinión, este es un problema de zona horaria. Porque mezclas dos formas diferentes de procesamiento de fechas e ignora la zona horaria.
Deshágase de la parte de manipulación de cadenas y use NSDatecomponents para todo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top