iPhone nscalendar - calendario incorrecto dibujado para usuarios fuera de nosotros
-
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";
}
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.