0

他の誰かのコードに取り組み、非常に多くの異なる反復を試みた後、カレンダーの月ビューの日付で何が間違っているのか理解できません。calendar.app のような月表示方式でカレンダーを表示しようとしていますが、残念ながらオーストラリアや英国などの国の一部のユーザーから、日付と日付の位置合わせが正しくないと報告されています。たとえば、オーストラリアでは 3 月 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";
}
4

2 に答える 2

1

NSDateComponents を使用して、曜日、月、年を取得します。それは結構です。
ただし、文字列操作を使用してその日を取得します。
そして、NSDate の description メソッドから取得した文字列を操作します。私の経験から、このメソッドは必要なものを何でも返します。説明メソッドがどのタイムゾーン オフセットを使用するかを理解できませんでした。私のマシンでは、UTC タイムゾーンで NSDate を返します。他のユーザーが SO について質問しており、このメソッドがローカル タイムゾーンまたはタイムゾーンで NSDate を返すことを暗示しています。ローカルタイムゾーンの隣。または任意のタイムゾーンで。タイムゾーン情報を使用できるため、通常は問題ありませんが、単に無視します。

簡単に言うと、日付処理が必要な場合は文字列処理を使用しないでください

私見これはタイムゾーンの問題です。日付処理の 2 つの異なる方法を混在させ、タイムゾーンを無視するためです。
文字列操作部分を取り除き、すべてに NSDateComponents を使用します。

于 2011-03-17T08:05:13.107 に答える
0

コードを変更する必要があります

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; を置き換えます。

NSCalendar *currentCalendar = [NSCalendar currentCalendar];

これにより、デバイスから現在のカレンダーが識別され、それに応じて実行されます

これで問題が解決することを願っています...

于 2011-03-17T05:38:41.827 に答える