Регистрация  |  Вход

Парсинг даты из строки формата ISO 8601

Привет всем.
На днях столкнулся с вопросом как лучше всего обмениватся датами между двумя стронним вебсервисом и Salesforce. Возможности apex по парсингу дат из строки жудко ограничены, а формат который нам присылали, тоже был заточен под российскую локаль. В общем было принято решение как-то это дело унифицировать и взять формат который понятен и Salesforce и русскому сервису. Выбор пал на ISO 8601
В нете нашел очень пример с хитрым решением и собственно им воспользовался.

string str = '"2013-01-30T07:38:44.268Z"';
System.debug(json.deserialize(str, datetime.class));

Но как всегда читал невнимательно и не учел один маленький нюанс (почему-то люблю много английского текста пропускать мимо ущей, вернее глаз)
does in fact serialize to ISo 8601 format, so after a couple of minutes of staring, I realized that the string has to be a valid JSON string, which means, we need double-quotes around it

По-русски - дата должна быть обернута в "" (обратите внимание на переменную str выше). А я тупо пихал в эту конструкцию дату из запроса.
В общем пока разобрался с этим малениким нюансом потратил кучу времени - без ковычек дата тоже парсится, но результат получается слегка неправильный.

Привет всем.
На днях столкнулся с вопросом как лучше всего обмениватся датами между двумя стронним вебсервисом и Salesforce. [b]Возможности apex по парсингу дат из строки жудко ограничены[/b], а формат который нам присылали, тоже был заточен под российскую локаль. В общем было принято решение как-то это дело унифицировать и взять формат который понятен и Salesforce и русскому сервису. Выбор пал на [url=http://en.wikipedia.org/wiki/ISO_8601]ISO 8601[/url]
В нете нашел очень [url=http://salesforce.stackexchange.com/questions/1013/parsing-an-iso-8601-timestamp-to-a-datetime]пример с хитрым решением[/url] и собственно им воспользовался. 
[code]
string str = '"2013-01-30T07:38:44.268Z"';
System.debug(json.deserialize(str, datetime.class));
[/code]
Но как всегда читал невнимательно и не учел один маленький нюанс (почему-то люблю много английского текста пропускать мимо ущей, вернее глаз)
[quote]does in fact serialize to ISo 8601 format, so after a couple of minutes of staring, I realized that the string has to be a valid JSON string, which means, we need double-quotes around it[/quote]
По-русски - дата должна быть обернута в "" (обратите внимание на переменную str выше). А я тупо пихал в эту конструкцию дату из запроса.
В общем пока разобрался с этим малениким нюансом потратил кучу времени - без ковычек дата тоже парсится, но результат получается слегка неправильный.

Я использую другую конструкцию. Если нужен более универсальный способ. Нужно обработать еще и UTC.

if (Value.endsWith('.000Z')) {
Value = Value.replace('T', ' ').replace('.000Z', '');
Value = datetime.valueOfGmt(Value).format('yyyy-MM-dd HH:mm:ss');
}

Я использую другую конструкцию. Если нужен более универсальный способ. Нужно обработать еще и UTC.

if (Value.endsWith('.000Z')) {
	Value = Value.replace('T', ' ').replace('.000Z', '');
	Value = datetime.valueOfGmt(Value).format('yyyy-MM-dd HH:mm:ss');
}

wilder
Я использую другую конструкцию. Если нужен более универсальный способ.

Чего-то я не понимаю чем он универсальнее? Поясни плиз.
ты специально отлавливаешь 000Z на конце, потом эту часть и T убираешь и скармливаешь Datetime.ValueOfGmt()

Провел просто небольшой эксперимент:

String str = '2013-01-30T07:38:44.000Z';
System.debug('XXXXX 1 - '+(Datetime)json.deserialize('"'+str+'"', datetime.class));
String sstr = str.replace('T', ' ').replace('.000Z', '');
System.debug('XXXXX 2 - '+Datetime.valueOfGmt(sstr));

Вывод в лог

16:36:36.057 (57343276)|USER_DEBUG|[2]|DEBUG|XXXXX 1 - 2013-01-30 07:38:44
16:36:36.057 (57655193)|USER_DEBUG|[4]|DEBUG|XXXXX 2 - 2013-01-30 07:38:44

В чем преимущество?

А как тогда ты обрабатываешь такую дату?

String str = '2013-01-30T07:38:44.000+03';
System.debug('XXXXX 1 - '+(Datetime)json.deserialize('"'+str+'"', datetime.class));

16:40:02.043 (43656452)|USER_DEBUG|[9]|DEBUG|XXXXX 1 - 2013-01-30 04:38:44

[quote="wilder"]Я использую другую конструкцию. Если нужен более универсальный способ.[/quote]
Чего-то я не понимаю чем он универсальнее? Поясни плиз.
ты специально отлавливаешь 000Z на конце, потом эту часть и T убираешь и скармливаешь Datetime.ValueOfGmt()

Провел просто небольшой эксперимент:
[code]
String str = '2013-01-30T07:38:44.000Z';
System.debug('XXXXX 1 - '+(Datetime)json.deserialize('"'+str+'"', datetime.class));
String sstr = str.replace('T', ' ').replace('.000Z', ''); 
System.debug('XXXXX 2 - '+Datetime.valueOfGmt(sstr)); 
[/code]

Вывод в лог
[quote]16:36:36.057 (57343276)|USER_DEBUG|[2]|DEBUG|XXXXX 1 - 2013-01-30 07:38:44
16:36:36.057 (57655193)|USER_DEBUG|[4]|DEBUG|XXXXX 2 - 2013-01-30 07:38:44[/quote]
В чем преимущество?

А как тогда ты обрабатываешь такую дату?
[code]
String str = '2013-01-30T07:38:44.000+03';
System.debug('XXXXX 1 - '+(Datetime)json.deserialize('"'+str+'"', datetime.class));
[/code]
[quote]16:40:02.043 (43656452)|USER_DEBUG|[9]|DEBUG|XXXXX 1 - 2013-01-30 04:38:44[/quote]

Dmitry Shnyrev
Если нужен более универсальный способ. Нужно обработать еще и UTC.
Это главное.

[quote="Dmitry Shnyrev"]Если нужен более универсальный способ. Нужно обработать еще и UTC.[/quote] Это главное.