найти дату EST сейчас в target-c iOS

Теперь мне нужно найти EST время, но я написал ниже функцию, которая вернет мне неправильное время, я не указал, где я сделал ошибку или я написал неправильный код, любой может заставить меня в некотором смысле было бы очень ценно.

@ROB ответ будет таким: "close_ts" = "2014-11-21T01:25:00"

 + (NSDate *)currentESTDate
{
    NSString *formatterDate = @"yyyy-MM-dd HH:mm:ss";

    NSDate* date = [NSDate date];
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
    [formatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"]];
    [formatter setDateFormat:formatterDate];
    NSString* currentDateStamp = [formatter stringFromDate:date];
    NSDate * returnDate = [formatter dateFromString:currentDateStamp];

    if( returnDate )
    {
        return returnDate;
    }
    return nil;
}

person Arun    schedule 06.11.2014    source источник
comment
Какой смысл преобразовывать текущую дату в строку, а затем преобразовывать эту строку обратно в дату и возвращать эту дату? Почему бы просто не использовать [NSDate date] как есть?   -  person rmaddy    schedule 06.11.2014
comment
@rmaddy мне нужно отформатировать текущую дату, но NSString* currentDateStamp = [formatter stringFromDate:date]; это вернет точное время в строковом формате, мне нужно это в формате даты, поэтому я снова преобразую его в [formatter dateFromString: currentDateStamp], это даст ложное время.   -  person Arun    schedule 06.11.2014
comment
Смотрите ответ Роба. Кажется, у вас есть некоторая путаница в том, как работают даты.   -  person rmaddy    schedule 06.11.2014
comment
Если вы ищете S.O. для вопросов о получении NSDate в конкретном часовом поясе, возможно, это даст полезную информацию. Например. см. stackoverflow.com/questions/ 7485493/   -  person Rob    schedule 06.11.2014
comment
@rmaddy, пожалуйста, посмотрите После того, как я обновил несколько строк кода, и мне нужно передать значения   -  person Arun    schedule 06.11.2014
comment
пожалуйста, укажите причину понижения?   -  person Arun    schedule 06.11.2014
comment
Я не голосовал против, но я предполагаю, что за него проголосовали, потому что об этом спрашивали много раз. Это распространенный камень преткновения, когда люди впервые начинают использовать NSDate. Без обид, но неясно, сколько исследований вы провели в поисках похожих вопросов, прежде чем задать их снова себе. Я лично немного ослабил вас, потому что связь между первоначальным вопросом, как мне преобразовать часовой пояс объекта NSDate, и корневой проблемой (неспособность правильно преобразовать 2014-11-21T01:25:00) не совсем очевидна. Но обе темы уже исчерпывающе освещались здесь ранее. :)   -  person Rob    schedule 06.11.2014


Ответы (1)


Вы говорите, что время указано как 2014-11-21T01:25:00. Это типичный RFC 3339/дата ISO 8601. См. Технический QA1480, что обычно:

NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.locale = enUSPOSIXLocale;
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss";
formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSDate *date = [formatter dateFromString:timeStamp];

Обратите внимание, что в этом формате временная метка почти всегда находится в формате GMT, а не EST. Чтобы устранить эту двусмысленность, большинство строк дат, которые мы получаем с серверов, обычно имеют Z в конце, например. 2014-11-21T01:25:00Z, чтобы недвусмысленно заявить, что дата в «зулусском», то есть GMT/UTC. Даже при отсутствии информации о часовом поясе мы обычно ожидаем, что это будет GMT. Если вы точно знаете, что это действительно EST (в чем я очень сомневаюсь; это было бы очень необычно), то измените строку timeZone выше (используя вашу timeZoneWithAbbreviation).

Вот как вы конвертируете строку даты, полученную с сервера, в NSDate. Затем вы можете сравнить это с [NSDate date], как предполагалось в вашей программе isEndDate:isSmallerThanCurrent:. Но не пытайтесь преобразовать NSDate в другой часовой пояс.


Вы говорите, что currentESTDate возвращает неправильное время. NSDateFormatter рассчитает текущую дату и время в EST в переменной currentDateStamp. Но затем вы конвертируете его обратно, просто получая исходное значение NSDate. Таким образом, эта рутина является ненужной.

Чтобы было ясно, у объектов NSDate нет часовых поясов. Они представляют один и тот же момент времени во всем мире. Часовые пояса вступают в игру только тогда, когда вы конвертируете дату в строку (через NSDateFormatter).

Таким образом, проблема не в том, «как преобразовать [NSDate date] в конкретный часовой пояс». Вопрос в том, как преобразовать строку 2014-11-21T01:25:00 с сервера в действительный объект NSDate (который затем можно сравнить с другими объектами NSDate). И, надеюсь, приведенный выше код отвечает на этот вопрос.

person Rob    schedule 06.11.2014
comment
на самом деле моя основная задача состоит в том, чтобы сравнить 2 даты, одна из которых - служба возвращает дату EST, и мне нужно преобразовать мою дату в текущую дату EST, а затем, как это работает в последний полный день, я проанализировал и обыскал все возможные вещи, но я понятия не имел . - person Arun; 06.11.2014
comment
мой вопрос дублирует один?…. Пожалуйста, предложите мне - person Arun; 06.11.2014
comment
@Spynet Да, это дубликат, но я вас немного ослабил, так как это один из тех вопросов, на которые трудно найти хорошие ответы (если вы уже не знаете ответ). ржу не могу. Что касается синтаксического анализа формата 2014-11-21T01:25:00, найдите [ios] nsdate t (хотя многие из ответов также пренебрегают тонкостью установки locale). Что касается первоначального вопроса о NSDate/часовом поясе, найдите [ios] nsdate текущий часовой пояс, и вы найдете несколько многообещающих ссылок (это заблуждение о NSDate и часовых поясах довольно распространено, как вы увидите, так что не расстраивайтесь). - person Rob; 06.11.2014