почему дата меняется, когда я пытаюсь изменить формат?

это код, который я использую для изменения формата даты

      NSLog(@"newBirthDates%@",_newwBirthDates);
    NSDateFormatter *Form = [[NSDateFormatter alloc] init];
    [Form setDateFormat:@"MM/dd"];
    NSDate *date1 =[NSDate date];
    NSString *string =[Form stringFromDate:date1];
     NSLog(@"string%@",string);
    NSDate *todaydate =[Form dateFromString:string];
     NSLog(@"todaydate%@",todaydate);

это то, что я получаю на выходе

     newBirthDates(
    "05/22",
    "07/11",
    "10/07",
    "02/20"
)
 newBirthDates(
    "05/22",
    "07/11",
    "10/07",
    "02/20"
)
 string03/18
 todaydate1970-03-17 18:30:00 +0000

теперь мой вопрос, почему 18.03 стало 17.03?? почему в один прекрасный день получить уменьшается


person user1660882    schedule 18.03.2013    source источник
comment
Совет: всегда сохраняйте полную дату в переменной/базе данных и форматируйте их только при отображении в пользовательском интерфейсе, в вашем конкретном случае это может быть связано с тем, что вы не сохраняете/не получаете год в строке даты.   -  person Adil Soomro    schedule 18.03.2013
comment
Добавил только один из возможных дубликатов, но проблема с проверкой правильности даты с помощью NSLog уже решалась много раз.   -  person Sulthan    schedule 18.03.2013


Ответы (4)


Ответ прост - часовые пояса. Внимательно посмотрите, что выводит NSLog
1970-03-17 18:30:00 +0000

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

По сути, исправлять нечего, вам просто нужно понять, как работает NSLog, если вы хотите использовать его для проверки значений NSDate.

person Sulthan    schedule 18.03.2013
comment
вау вау кто этот мужчина? ха-ха-ха, спасибо, но какое решение? теперь мы знаем, как работает nslog, но как решить эту проблему? я добавляю только одну дату в массив, который является сегодняшним, а затем в компьютере я устанавливаю дату на 17.03 23:59, и да, она не войдет, если условие в коде, даты cus не такие же очевидные, они не будут одинаковыми, теперь пользователь спит с приложением закрыть, а затем его очередь 12 утра означает 18-е, так почему я не получаю уведомление? - person user1660882; 18.03.2013
comment
извини, чувак, я начал говорить о других вещах, просто не обращай на это внимания - person user1660882; 18.03.2013

Ваш журнал отображается в соответствии со строковым значением, устраняя все важные различия в часовых поясах.

Журнал NSDate показывает время по Гринвичу.

И оба значения правильные.

Единственный примитивный метод NSDate, timeIntervalSinceReferenceDate, обеспечивает основу для всех остальных методов интерфейса NSDate. Этот метод возвращает значение времени относительно абсолютной контрольной даты — первого момента 1 января 2001 года по Гринвичу.

Вы должны прочитать документацию NSDate< /а>.

person Anoop Vaidya    schedule 18.03.2013

для получения правильной даты вы можете использовать этот,

 NSDateFormatter *Form = [[NSDateFormatter alloc] init];
    [Form setDateFormat:@"MM/dd"];
    [Form setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    NSDate *date1 =[NSDate date];
    NSString *string =[Form stringFromDate:date1];
    NSLog(@"string%@",string);
    NSDate *todaydate =[Form dateFromString:string];
    NSLog(@"todaydate%@",todaydate);

приведенный выше код даст правильную дату.

person Balu    schedule 18.03.2013

Главное - Часовой пояс : [Form setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

Это правильный код:

NSDateFormatter *Form = [[NSDateFormatter alloc] init];
[Form setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[Form setDateFormat:@"MM/dd"];
NSDate *date =[NSDate date];
NSString *string =[Form stringFromDate:date];
NSDate *todaydate = [Form dateFromString:string];
NSLog(@"todaydate %@",todaydate);
person Bhavin    schedule 18.03.2013