Проблемы с датой NSdate (часовой пояс) Время отображает 5 часов 30 минут прошедшего времени

На самом деле в моем симуляторе ВРЕМЯ отображается за последние 5 часов 30 минут.

Мое текущее время в Индии 2013-04-02 09:10:__ AM Но вывод 2013-04-02 03:54:51 +0000

2013 – 2 апреля – 9:10.

Мне нужно получить некоторые результаты между двумя датами 1. Первая дата месяца до 2. Текущая дата любого дня

т.е. с 1 по 2 апреля 9:10 t0 текущее время 2013-04-02 09:10:__

но он отображает

Дата первого дня месяца 2013-03-31 18:30:00 +0000

Текущее время как 2013-04-02 03:54 :51 +0000 но фактическое время 09:10:__

Я вычисляю первую дату месяца следующим образом

// TO IMPLEMENT CODE for FIRST DAY OF the Month
      NSCalendar* calendar = [NSCalendar currentCalendar];
      NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:[NSDate date]];

 calendar.timeZone = [NSTimeZone systemTimeZone];

      [comps setWeekday:1]; // 1: sunday
      monthComponent = comps.month;
      yearComponent = comps.year;
      dateFormatter = [[NSDateFormatter alloc] init];
      [dateFormatter setDateFormat:@"yyyy MM dd"];

 dateFormatter.timeZone = [NSTimeZone systemTimeZone];

      // To get the firstDateOfMonth for This MONTH.
      NSDate *firstDateOfMonth = [dateFormatter dateFromString:[NSString stringWithFormat:@"%d %d 01",yearComponent,monthComponent]];

      NSLog(@"firstDateOfMonth-- %@ \r\n",firstDateOfMonth);
       NSLog(@"[NSDate date]-- %@",[NSDate date]);

Я установил часовой пояс SystemTimeZone, даже подумал i got wrong results for Current date and firstDateOfMonth

заранее спасибо


person iOS dev    schedule 02.04.2013    source источник


Ответы (4)


Проблема часовых поясов. По умолчанию NSDateFormatter настроен на ваш местный часовой пояс. Это означает, что если ваш часовой пояс +5:30, то дата "1970/18/3" дает 1970-03-18 00:00:00 +0530. Однако NSLog всегда печатает даты в часовом поясе GMT ​​(нулевой), добавляя/вычитая разницу часовых поясов (5 часов 30 минут).

 NSCalendar* calendar = [NSCalendar currentCalendar];
    NSDateComponents* comps = [calendar components:NSYearForWeekOfYearCalendarUnit |NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:[NSDate date]];


    [comps setWeekday:1]; 
    int monthComponent = comps.month;
   int yearComponent = comps.year;
   NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy MM dd"];

    NSDate *firstDateOfMonth = [dateFormatter dateFromString:[NSString stringWithFormat:@"%d %d 01",yearComponent,monthComponent]];
    firstDateOfMonth = [firstDateOfMonth dateByAddingTimeInterval:19800];
    NSLog(@"firstDateOfMonth-- %@ \r\n",firstDateOfMonth);
    NSLog(@"[NSDate date]-- %@",[[NSDate date] dateByAddingTimeInterval:19800]);
person Balu    schedule 02.04.2013

Попробуй....

NSDate* date = [NSDate date];
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
NSTimeZone *destinationTimeZone = [NSTimeZone systemTimeZone];
formatter.timeZone = destinationTimeZone;
[formatter setDateStyle:NSDateFormatterLongStyle];
[formatter setDateFormat:@"MM/dd/yyyy hh:mma"];
NSString* dateString = [formatter stringFromDate:date];
person Chirag Pipaliya    schedule 02.04.2013

Проблема в часовых поясах, как сказал Санни, плюс непонимание того, что на самом деле означает NSDate.

NSDate представляет моменты времени, одинаковые во всем мире. Если мы вызовем [NSDate date] в тот же момент, мы получим тот же результат, и NSLog распечатает его таким же образом. Однако, если мы оба посмотрим на наши часы, мы увидим разное время.

Вы находитесь в Индии. Если вы посмотрите на часы ровно в полночь, они покажут 12 часов дня. Если человек в Лондоне посмотрит на часы в один и тот же момент времени, этот человек увидит 18:30. Их часы всегда на 5 1/2 часов отстают от ваших. И это то, что отображает NSLog.

Например, вы правильно рассчитали NSDate на начало месяца в Индии. Начало месяца было 1 апреля, в полночь начала дня - по индийскому времени. Но на тот момент в Лондоне все еще 31 марта, 18:30. И это то, что отображает NSDate. Вы всегда получали правильный результат.

person gnasher729    schedule 07.05.2014

@IOS разработчик,

Возможно дело в часовом поясе. Проверьте настройки симулятора. Используйте ссылку ниже:

симулятор местоположения xcode 4.2 и часовой пояс Также проверьте с помощью [NSTimeZone localTimeZone].

См. ссылку ниже:

NSTimeZone: в чем разница между localTimeZone и systemTimeZone?

person Ramu Pasupuleti    schedule 02.04.2013
comment
Нет, проблема в неправильном понимании NSDate. - person gnasher729; 07.05.2014