15.06.2014, 15:20 | #1 |
Участник
|
Часовой пояс на сервере или передача даты через параметр ссылки
Доброго времени суток.
Подскажите, плиз, хранится ли где-то в crm 2011 значение часового пояса сервера? Дело в том, что при передаче даты по ссылке, скажем открытия карточки новой сущности, эта дата передается как UTC, то бишь по Гринвичу. Потому, при передаче даты в формате 2014-05-12T04:30Z, при открытии окна с переданной ссылкой, ко времени 04:30 прибавляется время по выставленному часовому поясу, который нужно учитывать. |
|
15.06.2014, 15:46 | #2 |
Чайный пьяница
|
Добрый день,
Думаю, что это время непосредственно в CRM не хранится, а используется часовая зона и время, которые выставлены непосредственно на сервере. Для решения вашей проблемы я бы рекомендовал воспользоваться методом преобразования дат через SOAP эндпоинт - http://inogic.com/blog/2013/06/how-t...e-time-format/
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
15.06.2014, 16:59 | #3 |
Участник
|
Не, это не то. Здесь преобразование местного времени к Гринвичу и обратно для пользователя.
В моем случае цепочка выглядит так: на клиенте пользователь выбирает дату и время. Здесь с неё проблем нету, хоть она будет локальная, хоть по Гринвичу. Дальше эта дата передается на сервер, который находится в другом часовом поясе. На сервере она подставляется в нужное поле + изменяется в зависимости от того часового пояса, который установлен на сервере. И потом страницы отдается в назад клиенту в браузер. Так что здесь видится 3 варианта: 1) каким-то образом передать дату в формате локальном формате, а не UTC (насколько я понимаю, так сделать нельзя); 2) учитывать часовой пояс сервера, но не понятно, как его получить программно; 3) на сервере в момент получения даты преобразовывать UTC время в местное. Тоже не известно, как сделать Последний раз редактировалось vasya-serega; 15.06.2014 в 17:25. |
|
15.06.2014, 17:58 | #4 |
Moderator
|
Стало интересно, так что я посмотрел SDK: http://msdn.microsoft.com/en-us/libr...alueDateFields. Вообще, про UTC в данном случае ничего не сказано. Однако есть ряд источников, где работа со временем в CRM рассматривается более подробно: http://www.powerobjects.com/blog/201...bout-datetime/, http://blogs.msdn.com/b/crm/archive/...amics-crm.aspx, http://www.develop1.net/public/post/...last-word.aspx.
Основной момент с которым я несколько раз сталкивался, когда писал свои "машины времени" - это то, что система возвращает время в UTC, в то время как принимает всегда в локальном формате авторизованного пользователя. Сейчас нет возможности проверить, как это работает при открытии формы через JS, но есть все основания полагать, что это должно работать так же как и во всех остальных случаях: необходимо передавать дату в локальном времени пользователя, и не нужно приводить ее к UTC. Если возникают какие-то накладки, убедитесь что в профиле пользователя в CRM и в параметрах ОС выставлен корректный часовой пояс и формат времени.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
15.06.2014, 22:15 | #5 |
Участник
|
Цитата:
Сообщение от Артем Enot Грунин
... есть все основания полагать, что это должно работать так же как и во всех остальных случаях: необходимо передавать дату в локальном времени пользователя, и не нужно приводить ее к UTC. Если возникают какие-то накладки, убедитесь что в профиле пользователя в CRM и в параметрах ОС выставлен корректный часовой пояс и формат времени.
a33ik, порывшись в инете, нашел вашу заметку о получении серверного времени для CRM 4.0. Правда там приходится юзать дополнительный плагин. Не хотелось бы, но пока это единственный выход, который подходит. Последний раз редактировалось vasya-serega; 15.06.2014 в 22:17. |
|
16.06.2014, 12:17 | #6 |
Moderator
|
В качестве быстрого ответа... Наговнякал такой вот код, который, судя по всему работает, но нужно еще понять почему. Постараюсь разобраться после обеда:
X++: function OpenForm() { var now = new Date(); now.setMinutes(now.getMinutes() - now.getTimezoneOffset()); var parameters = {}; parameters["subject"] = "Test"; parameters["scheduledstart"] = now.toISOString(); Xrm.Utility.openEntityForm("appointment", null, parameters); }
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional Последний раз редактировалось Артем Enot Грунин; 16.06.2014 в 13:14. |
|
16.06.2014, 13:45 | #7 |
Moderator
|
Вы уверены что проверили настройки часового пояса в профиле пользователя?
Судя по всему, проблема, все же в вашем коде. Извращения с часовым поясом требуются только для того, чтобы использовать функцию toISOString, которая, кстати, не поддерживается в IE8-. Если накляпать дату вручную (в локальных значениях), то все корректно работает: X++: function OpenForm() { debugger; var now = new Date(); now.setMinutes(now.getMinutes() + now.getTimezoneOffset() * -1); var parameters = {}; parameters["subject"] = "Test"; parameters["scheduledstart"] = toLocalISODateString(now); Xrm.Utility.openEntityForm("appointment", null, parameters); } function toLocalISODateString(date) { function _twoString(number) { return number > 9 ? "" + number : "0" + number; } if (date.toISOString == undefined) { var isoDateString = date.getUTCFullYear(); isoDateString += "-" + this._twoString(date.getUTCMonth() + 1); isoDateString += "-" + this._twoString(date.getUTCDate()); isoDateString += "T" + this._twoString(date.getUTCHours()); isoDateString += ":" + this._twoString(date.getUTCMinutes()); isoDateString += ":" + this._twoString(date.getUTCSeconds()); isoDateString += "." + this._twoString(date.getUTCMilliseconds()); isoDateString += "Z"; return isoDateString; } else { return date.toISOString(); } }
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
16.06.2014, 20:02 | #8 |
Участник
|
|
|
17.06.2014, 00:21 | #9 |
Moderator
|
В любом окне системы, выберите меню "файл" (фиолетовая кнопка, левый верхний угол окна), далее параметры. На первой странице должен быть указан часовой пояс текущего пользователя. Все даты, которые система принимает под ним, будут приниматься как даты в этом часовом поясе.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
17.06.2014, 01:10 | #10 |
Участник
|
Ваш код отрабатывает так, как и нужно, если его запускать на JS обработчик событий формы или контролов. Проверил у себя, всё ок. Если же запускать из модального диалога, отображающего веб-ресурс, как в моем случае, получается вот такая ерунда.
Насчет настроек пользователя. Действительно, я не туда смотрел, заглядывая в usersettings. Если через Файл \ Параметры, то какой бы там не ставил, всё равно учитывается часой пояс сервера, а не пользователя. Так что вопрос остается открытым. |
|
17.06.2014, 13:07 | #11 |
Moderator
|
Хм, очень интересно. Сейчас попробую
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
17.06.2014, 13:18 | #12 |
Участник
|
и так подключите ClientGlobalContext.js.aspx и выполните вот такой код и будет вам счастье
X++: Xrm.Utility.openEntityForm("task",null,{scheduledend: '2014-6-5T06:00'}); Последний раз редактировалось spectr; 17.06.2014 в 13:22. |
|
17.06.2014, 13:44 | #13 |
Moderator
|
Все еще работает. Добавил веб ресурс "Dialog.html":
X++: <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Open Appointment</title></head> <body> <script src="ClientGlobalContext.js.aspx" type="text/javascript"></script> <script src="fixrm_OpenAppointment" type="text/javascript" ></script> <form action="fixrm_Dialog.html" method="post"> <input type="button" value="Open New Appointment" onclick="OpenForm()" /> </form> </body> </html> X++: function OpenDialog() { Xrm.Utility.openWebResource("fixrm_Dialog.html", null, 300, 30); } function OpenForm() { var now = new Date(); now.setMinutes(now.getMinutes() + now.getTimezoneOffset() * -1); var parameters = {}; parameters["subject"] = "Test"; parameters["scheduledstart"] = toLocalISODateString(now); Xrm.Utility.openEntityForm("appointment", null, parameters); } function _twoString(number) { return number > 9 ? "" + number : "0" + number; } function toLocalISODateString(date) { if (date.toISOString == undefined) { var isoDateString = date.getUTCFullYear(); isoDateString += "-" + this._twoString(date.getUTCMonth() + 1); isoDateString += "-" + this._twoString(date.getUTCDate()); isoDateString += "T" + this._twoString(date.getUTCHours()); isoDateString += ":" + this._twoString(date.getUTCMinutes()); isoDateString += ":" + this._twoString(date.getUTCSeconds()); isoDateString += "." + this._twoString(date.getUTCMilliseconds()); isoDateString += "Z"; return isoDateString; } else { return date.toISOString(); } }
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
17.06.2014, 13:48 | #14 |
Moderator
|
Цитата:
Можно подробнее. Я, например, "Z" передаю и каких-то особых преобразований не наблюдаю.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
17.06.2014, 14:14 | #15 |
Участник
|
Цитата:
В СРМ формат даты таков datetime'2010-07-15' or datetime'2010-07-15T16:19:54Z' взято с msdn где T - разделяет дату и время, а Z - "is in the same time zone as Coordinated Universal Time (UTC)" грубо говоря горит что это время в UTC Потому можно передавать только 4 варианта даты и времени: 2010-07-15 - дата в локальном часовом поясе в базу попадет + или - часовой пояс 2010-07-15Z - дата в часовом поясе UTC в базу попадет без изменений 2010-07-15T16:19:54 - дата в локальном часовом поясе в базу попадет + или - часовой пояс 2010-07-15T16:19:54Z - дата в часовом поясе UTC в базу попадет без изменений А теперь про передачу параметра в ссылке Если вы передаете с Z то сервер знает что это время в UTC и его нужно подогнать в нормальный вид, что собственно и делается. Я предполагаю что так как парсинг URL проходит на сервере то и часовой пояс берется сервера а не пользователя СРМ. А вот если вы не указываете Z, то дата и время считаются локальными и выдаются без изменений. А теперь что касается вашего примера то очень интересно как себя ведет СРМ ? Но мне понятно только одно что по вашей схеме передается полная форма 2014-6-5T06:00:47.664Z которая отображается без изменений так как и 2014-6-5T06:00 хотя Z явно указывает на UTC. Возможно дело в том что СРМ не берет во внимание секунды и миллисекунды так как их не умеет отображать потому после отсекания их у вас тоже получается что-то такое 2014-6-5T06:00: . Думаю кратко и понятно Последний раз редактировалось spectr; 17.06.2014 в 14:17. |
|
|
За это сообщение автора поблагодарили: -DocSerzh- (1), Артем Enot Грунин (2), vasya-serega (1). |
17.06.2014, 17:19 | #16 |
Moderator
|
Я думаю проблема в том, что мой сервер в том же часовом поясе, что и я
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
17.06.2014, 21:54 | #17 |
Участник
|
Цитата:
Сообщение от spectr
Можно
В СРМ формат даты таков datetime'2010-07-15' or datetime'2010-07-15T16:19:54Z' взято с msdn где T - разделяет дату и время, а Z - "is in the same time zone as Coordinated Universal Time (UTC)" грубо говоря горит что это время в UTC +1 Что не делали, всё равно правильно )) Всегда бы так |
|
17.06.2014, 22:15 | #18 |
Moderator
|
Не за что
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
24.07.2014, 18:05 | #19 |
Участник
|
Цитата:
Цитата:
The OData specification for the Filter System Query Option describes the operators used to create an expression to evaluate in the filter. Microsoft Dynamics CRM uses all the logical operators and a subset of the functions available, but doesn’t support use of the arithmetic operators. Filters can use grouped conditions indicated by parentheses. Comparisons of time values must use the following format: datetime’<time value>’, for example datetime'2010-07-15' or datetime'2010-07-15T16:19:54Z'.
|
|
|
|