iPhone NSCalendar - Calendario errato Disegnato per gli utenti al di fuori degli Stati Uniti

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

  •  26-10-2019
  •  | 
  •  

Domanda

Dopo aver cercato di lavorare sul codice di qualcun altro, e tante iterazioni diverse, non sono in grado di capire che cosa sto facendo di sbagliato con date su un calendario di vista mensile. Sto cercando di presentare un calendario in vista mensile moda come calendar.app ma purtroppo alcuni utenti in paesi come l'Australia, Regno Unito stanno segnalando allineamento errato di giorni per le date. Per esempio in Australia visualizza 17 marzo come Venerdì. Ogni aiuto è molto apprezzato!

Ecco l'esempio di codice che sto 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];
}

E questo è il modo im popolano il 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;
    }

}

E infine 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";
}
È stato utile?

Soluzione

È necessario modificare il codice

sostituire NSCalendar * gregoriano = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];

con

* NSCalendar currentCalendar = [NSCalendar currentCalendar];

questo identificherà il calendario attuale dal dispositivo e si esibirà di conseguenza

Spero che questo risolverà il vostro problema ...

Altri suggerimenti

Si utilizza NSDateComponents per ottenere il giorno della settimana, il mese e l'anno. Che va bene.
Ma poi si utilizza la manipolazione di stringhe per ottenere il giorno.
E di manipolare la stringa che si ottiene dal metodo descrizione di NSDate. E dalla mia esperienza questo metodo restituisce quello che vuole. Non potrei mai capire quale fuso orario compensato gli usi descrizione del metodo, sulla mia macchina restituisce l'NSDate in UTC fuso orario, altri utenti hanno chiesto domande sul SO che implicano che questo metodo restituisce il NSDate nel fuso orario locale, o in un fuso orario che è accanto al fuso orario locale. O in un fuso orario arbitrario. Di solito questo non è un problema perché è possibile utilizzare le informazioni fuso orario, ma semplicemente ignorarlo.

Per fare una lunga storia breve: Non utilizzare l'elaborazione delle stringhe, se si desidera data di elaborazione

IMHO questo è un problema di fuso orario. Perché si mescolano due diversi modi di elaborazione data, e si ignora il fuso orario.
Sbarazzarsi delle manipolazione di stringhe di parte e sull'uso NSDateComponents per tutto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top