Почему моя расчетная метка времени не является точной (+32 или +16 секунд)? - PullRequest
1 голос
/ 30 декабря 2011

Я не могу понять результат моего кода, мне нужна ваша помощь.

Например, если текущее время 5H00 AM, я хочу получить две метки времени при вызове моего метода :

[self getPeriodValues:@"day"];
  • Временная метка текущего дня в 00:00.
  • Отметка времени текущего времени в 5:00 утра.

Для первой отметки времени у меня есть результат, но с еще 32 секундами!

В моем втором примере, если текущая дата 2011/12/30 в 5:00 AM, и я хочу две метки времени, когда я вызываю мой метод :

[self getPeriodValues:@"year"];
  • Временная метка текущего года с датой 2011/01/01 в 00:00.
  • Временная метка текущей даты и времени: 2011/12/30 в 5:00 AM.

Для первой отметки времени у меня есть результат, но с еще 16 секундами!

Все мои дела:

  • Для @ "дня" у меня есть еще 32 секунды.
  • Для @ "вчера" у меня есть еще 32 секунды.
  • Для @ "недели" у меня есть еще 32 секунды.
  • На @ "месяц" у меня есть еще 32 секунды.
  • Для @ "previousMonth" у меня есть еще 32 секунды.
  • Для @ "год" у меня есть еще 16 секунд.
  • Для @ "previousYear" у меня есть еще 16 секунд.

вот код моего метода:

-(void)getPeriodValues:(NSString*)period
{
log_debug("@@@@@ BackEnd - getPeriodValues @@@@@")

float startDateFloatTimeStamp;
float endDateFloatTimeStamp;

NSString * startDateStrNumericTimeStamp;
NSString * endDateStrNumericTimeStamp;

NSDateComponents *compsStart;
NSDateComponents *compsEnd;

NSDate * startDate;
NSDate * endDate;

NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit| NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDate *date = [NSDate date];
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date] ;
NSInteger year = [dateComponents year];
NSInteger month = [dateComponents month];
//NSInteger week = [dateComponents week];
NSInteger day = [dateComponents day];
NSInteger hour = [dateComponents hour];
NSInteger minute = [dateComponents minute];
NSInteger second = [dateComponents second];

log_debug (@"year : %ld", (long)year);
log_debug (@"month : %ld", (long)month);
log_debug (@"day : %ld", (long)day);
log_debug (@"hour : %ld", (long)hour);
log_debug (@"minute : %ld", (long)minute);
log_debug (@"second : %ld", (long)second);
log_debug (@"date : %ld", (long)[date timeIntervalSince1970]);

if ([period isEqualToString:@"day"]) {

    // start at 00h00m32s of current day to current time

    compsStart = [[[NSDateComponents alloc] init] autorelease];
    [compsStart setYear:year];
    [compsStart setMonth:month];
    [compsStart setDay:day];



    compsEnd = [[[NSDateComponents alloc] init] autorelease];
    [compsEnd setYear:year];
    [compsEnd setMonth:month];
    [compsEnd setDay:day];
    [compsEnd setHour:hour];
    [compsEnd setMinute:minute];
    [compsEnd setSecond:second];


} else if ([period isEqualToString:@"yesterday"]) {

    // Start yesterday at 00h00m32s, End today at 00h00m32s

    compsStart = [[[NSDateComponents alloc] init] autorelease];
    [compsStart setYear:year];
    [compsStart setMonth:month];
    [compsStart setDay:day-1];

    compsEnd = [[[NSDateComponents alloc] init] autorelease];
    [compsEnd setYear:year];
    [compsEnd setMonth:month];
    [compsEnd setDay:day];


} else if ([period isEqualToString:@"week"]) {

    // -7 days at 00h00m32s, End today at 00h00m32s

    compsStart = [[[NSDateComponents alloc] init] autorelease];
    [compsStart setYear:year];
    [compsStart setMonth:month];
    [compsStart setDay:day-7];

    compsEnd = [[[NSDateComponents alloc] init] autorelease];
    [compsEnd setYear:year];
    [compsEnd setMonth:month];
    [compsEnd setDay:day];

} else if ([period isEqualToString:@"month"]) {

    // ...

    compsStart = [[[NSDateComponents alloc] init] autorelease];
    [compsStart setYear:year];
    [compsStart setMonth:month];
    [compsStart setDay:1];

    compsEnd = [[[NSDateComponents alloc] init] autorelease];
    [compsEnd setYear:year];
    [compsEnd setMonth:month];
    [compsEnd setDay:day];
    [compsEnd setHour:hour];
    [compsEnd setMinute:minute];
    [compsEnd setSecond:second];

} else if ([period isEqualToString:@"previousMonth"]) {

    // ...

    compsStart = [[[NSDateComponents alloc] init] autorelease];
    [compsStart setYear:year];
    [compsStart setMonth:month-1];
    [compsStart setDay:1];

    compsEnd = [[[NSDateComponents alloc] init] autorelease];
    [compsEnd setYear:year];
    [compsEnd setMonth:month];
    [compsEnd setDay:1];

} else if ([period isEqualToString:@"year"]) {

    // du 01/01 de cette année à 00h00m16s, à aujourd'hui pour l'heure actuelle

    compsStart = [[[NSDateComponents alloc] init] autorelease];
    [compsStart setYear:year];
    [compsStart setMonth:1];
    [compsStart setDay:1];

    compsEnd = [[[NSDateComponents alloc] init] autorelease];
    [compsEnd setYear:year];
    [compsEnd setMonth:month];
    [compsEnd setDay:day];
    [compsEnd setHour:hour];
    [compsEnd setMinute:minute];
    [compsEnd setSecond:second];

} else if ([period isEqualToString:@"previousYear"]) {

    // ...

    compsStart = [[[NSDateComponents alloc] init] autorelease];
    [compsStart setYear:year-1];
    [compsStart setMonth:1];
    [compsStart setDay:1];

    compsEnd = [[[NSDateComponents alloc] init] autorelease];
    [compsEnd setYear:year];
    [compsEnd setMonth:1];
    [compsEnd setDay:1];

} else {

    // ... same as day

    compsStart = [[[NSDateComponents alloc] init] autorelease];
    [compsStart setYear:year];
    [compsStart setMonth:month];
    [compsStart setDay:day];


    compsEnd = [[[NSDateComponents alloc] init] autorelease];
    [compsEnd setYear:year];
    [compsEnd setMonth:month];
    [compsEnd setDay:day];
    [compsEnd setHour:hour];
    [compsEnd setMinute:minute];
    [compsEnd setSecond:second];

}

startDate = [[NSCalendar currentCalendar] dateFromComponents:compsStart];
startDateFloatTimeStamp = [startDate timeIntervalSince1970];

endDate = [[NSCalendar currentCalendar] dateFromComponents:compsEnd];
endDateFloatTimeStamp = [endDate timeIntervalSince1970];

startDateStrNumericTimeStamp = [NSString stringWithFormat:@"%i000",(int) floor(startDateFloatTimeStamp)];
endDateStrNumericTimeStamp = [NSString stringWithFormat:@"%i000",(int) floor(endDateFloatTimeStamp)];

log_debug(@"Start timestamp : %@",startDateStrNumericTimeStamp);
log_debug(@"End timestamp : %@",endDateStrNumericTimeStamp);

...
}

Наконец, почему мой метод добавляет 32 или 16 секунд?

Редактировать для добавления журналов:

для случая "день":

2012-01-02 09:09:43.855 TestApp[33070:207] -[BEServiceWeather getPeriodValues:] [Line 82] year : 2012
2012-01-02 09:09:43.856 TestApp[33070:207] -[BEServiceWeather getPeriodValues:] [Line 83] month : 1
2012-01-02 09:09:43.856 TestApp[33070:207] -[BEServiceWeather getPeriodValues:] [Line 84] day : 2
2012-01-02 09:09:43.857 TestApp[33070:207] -[BEServiceWeather getPeriodValues:] [Line 85] hour : 9
2012-01-02 09:09:43.857 TestApp[33070:207] -[BEServiceWeather getPeriodValues:] [Line 86] minute : 9
2012-01-02 09:09:43.858 TestApp[33070:207] -[BEServiceWeather getPeriodValues:] [Line 87] second : 43
2012-01-02 09:09:43.858 TestApp[33070:207] -[BEServiceWeather getPeriodValues:] [Line 88] date : 1325491783
2012-01-02 09:09:43.859 TestApp[33070:207] -[BEServiceWeather getPeriodValues:] [Line 232] Start timestamp : 1325458816000
2012-01-02 09:09:43.859 TestApp[33070:207] -[BEServiceWeather getPeriodValues:] [Line 233] End timestamp : 1325491840000

Как мы видим, на начальный день у меня 1325458816000, а у меня должно быть: 1325458800000

...