Привет всем.
На днях столкнулся с вопросом как лучше всего обмениватся датами между двумя стронним вебсервисом и Salesforce. Возможности apex по парсингу дат из строки жудко ограничены, а формат который нам присылали, тоже был заточен под российскую локаль. В общем было принято решение как-то это дело унифицировать и взять формат который понятен и Salesforce и русскому сервису. Выбор пал на ISO 8601
В нете нашел очень пример с хитрым решением и собственно им воспользовался.
string str = '"2013-01-30T07:38:44.268Z"';
System.debug(json.deserialize(str, datetime.class));
Привет всем. На днях столкнулся с вопросом как лучше всего обмениватся датами между двумя стронним вебсервисом и 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'); }
Провел просто небольшой эксперимент:
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));
Вывод в лог
А как тогда ты обрабатываешь такую дату?
String str = '2013-01-30T07:38:44.000+03';
System.debug('XXXXX 1 - '+(Datetime)json.deserialize('"'+str+'"', datetime.class));
[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]
[quote="Dmitry Shnyrev"]Если нужен более универсальный способ. Нужно обработать еще и UTC.[/quote] Это главное.