AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.06.2014, 15:20   #1  
vasya-serega is offline
vasya-serega
Участник
 
145 / 17 (1) ++
Регистрация: 12.05.2013
Адрес: Украина
Часовой пояс на сервере или передача даты через параметр ссылки
Доброго времени суток.
Подскажите, плиз, хранится ли где-то в crm 2011 значение часового пояса сервера? Дело в том, что при передаче даты по ссылке, скажем открытия карточки новой сущности, эта дата передается как UTC, то бишь по Гринвичу. Потому, при передаче даты в формате 2014-05-12T04:30Z, при открытии окна с переданной ссылкой, ко времени 04:30 прибавляется время по выставленному часовому поясу, который нужно учитывать.
Старый 15.06.2014, 15:46   #2  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Добрый день,

Думаю, что это время непосредственно в CRM не хранится, а используется часовая зона и время, которые выставлены непосредственно на сервере. Для решения вашей проблемы я бы рекомендовал воспользоваться методом преобразования дат через SOAP эндпоинт - http://inogic.com/blog/2013/06/how-t...e-time-format/
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 15.06.2014, 16:59   #3  
vasya-serega is offline
vasya-serega
Участник
 
145 / 17 (1) ++
Регистрация: 12.05.2013
Адрес: Украина
Не, это не то. Здесь преобразование местного времени к Гринвичу и обратно для пользователя.
В моем случае цепочка выглядит так: на клиенте пользователь выбирает дату и время. Здесь с неё проблем нету, хоть она будет локальная, хоть по Гринвичу. Дальше эта дата передается на сервер, который находится в другом часовом поясе. На сервере она подставляется в нужное поле + изменяется в зависимости от того часового пояса, который установлен на сервере. И потом страницы отдается в назад клиенту в браузер.
Так что здесь видится 3 варианта:
1) каким-то образом передать дату в формате локальном формате, а не UTC (насколько я понимаю, так сделать нельзя);
2) учитывать часовой пояс сервера, но не понятно, как его получить программно;
3) на сервере в момент получения даты преобразовывать UTC время в местное. Тоже не известно, как сделать

Последний раз редактировалось vasya-serega; 15.06.2014 в 17:25.
Старый 15.06.2014, 17:58   #4  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Стало интересно, так что я посмотрел 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  
vasya-serega is offline
vasya-serega
Участник
 
145 / 17 (1) ++
Регистрация: 12.05.2013
Адрес: Украина
Цитата:
Сообщение от Артем Enot Грунин Посмотреть сообщение
... есть все основания полагать, что это должно работать так же как и во всех остальных случаях: необходимо передавать дату в локальном времени пользователя, и не нужно приводить ее к UTC. Если возникают какие-то накладки, убедитесь что в профиле пользователя в CRM и в параметрах ОС выставлен корректный часовой пояс и формат времени.
Мой пример показывает обратное. Есть веб-ресурс, на котором пользователь выбирается дату и время. Затем формируется ссылка http ://serv_name/main.aspx?etc=4201&extraqs=...scheduledstart%3d2014-6-5T05%253a00Z%26scheduledend%3d2014-6-5T06%253a30Z%26...&pagetype=entityrecord, которая открывается в браузере. Как видно по выделенным жирным цифрам времени, приходится учитывать часовой пояс на сервере (+4), а никак не пользователя (+2), который в принципе это время выбирал.

a33ik, порывшись в инете, нашел вашу заметку о получении серверного времени для CRM 4.0. Правда там приходится юзать дополнительный плагин. Не хотелось бы, но пока это единственный выход, который подходит.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 382
Размер:	35.8 Кб
ID:	8888  

Последний раз редактировалось vasya-serega; 15.06.2014 в 22:17.
Старый 16.06.2014, 12:17   #6  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
В качестве быстрого ответа... Наговнякал такой вот код, который, судя по всему работает, но нужно еще понять почему. Постараюсь разобраться после обеда:
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  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Вы уверены что проверили настройки часового пояса в профиле пользователя?

Судя по всему, проблема, все же в вашем коде. Извращения с часовым поясом требуются только для того, чтобы использовать функцию 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  
vasya-serega is offline
vasya-serega
Участник
 
145 / 17 (1) ++
Регистрация: 12.05.2013
Адрес: Украина
Цитата:
Сообщение от Артем Enot Грунин Посмотреть сообщение
Вы уверены что проверили настройки часового пояса в профиле пользователя?
Заставили меня сомневаться, может я не туда смотрю. Подскажите, как это сделать?
Старый 17.06.2014, 00:21   #9  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
В любом окне системы, выберите меню "файл" (фиолетовая кнопка, левый верхний угол окна), далее параметры. На первой странице должен быть указан часовой пояс текущего пользователя. Все даты, которые система принимает под ним, будут приниматься как даты в этом часовом поясе.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 17.06.2014, 01:10   #10  
vasya-serega is offline
vasya-serega
Участник
 
145 / 17 (1) ++
Регистрация: 12.05.2013
Адрес: Украина
Ваш код отрабатывает так, как и нужно, если его запускать на JS обработчик событий формы или контролов. Проверил у себя, всё ок. Если же запускать из модального диалога, отображающего веб-ресурс, как в моем случае, получается вот такая ерунда.

Насчет настроек пользователя. Действительно, я не туда смотрел, заглядывая в usersettings. Если через Файл \ Параметры, то какой бы там не ставил, всё равно учитывается часой пояс сервера, а не пользователя. Так что вопрос остается открытым.
Старый 17.06.2014, 13:07   #11  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Хм, очень интересно. Сейчас попробую
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 17.06.2014, 13:18   #12  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
и так подключите ClientGlobalContext.js.aspx и выполните вот такой код и будет вам счастье
X++:
Xrm.Utility.openEntityForm("task",null,{scheduledend: '2014-6-5T06:00'});
Забыл дописать если вы поставите в конце Z то он преобразует его в зависимости от часового пояса системы.

Последний раз редактировалось spectr; 17.06.2014 в 13:22.
Старый 17.06.2014, 13:48   #13  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Цитата:
Сообщение от spectr Посмотреть сообщение
и так подключите ClientGlobalContext.js.aspx и выполните вот такой код и будет вам счастье
Можно, вероятно, и без этой утилиты обойтись. Она, насколько мне известно, даты не преобразует, просто параметры корректно передает в форму
Цитата:
Сообщение от spectr Посмотреть сообщение
]Забыл дописать если вы поставите в конце Z то он преобразует его в зависимости от часового пояса системы.
Можно подробнее. Я, например, "Z" передаю и каких-то особых преобразований не наблюдаю.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 17.06.2014, 14:14   #14  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
Цитата:
Сообщение от Артем Enot Грунин Посмотреть сообщение
Можно подробнее. Я, например, "Z" передаю и каких-то особых преобразований не наблюдаю.
Можно
В СРМ формат даты таков 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, 21:54   #15  
vasya-serega is offline
vasya-serega
Участник
 
145 / 17 (1) ++
Регистрация: 12.05.2013
Адрес: Украина
Цитата:
Сообщение от 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
Что-то по вашей ссылке я описания не нашел, но проблема оказалась как раз в формате. Стоило убрать Z, как на сервере всякие преобразования даты прекратились!
+1

Цитата:
Сообщение от Артем Enot Грунин Посмотреть сообщение
Я думаю проблема в том, что мой сервер в том же часовом поясе, что и я
Что не делали, всё равно правильно )) Всегда бы так
Старый 17.06.2014, 13:44   #16  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Все еще работает. Добавил веб ресурс "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>
На OnLoad повесил вызов функции OpenDialog
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();
    }
}
Даты корректные. Могу, конечно, проверить вызов с ленты, но сомневаюсь что что-то от этого изменится. Код теперь выполняется в отдельном window. Может быть вы уже свой код покажете?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 17.06.2014, 17:19   #17  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Я думаю проблема в том, что мой сервер в том же часовом поясе, что и я
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 17.06.2014, 22:15   #18  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Не за что
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка JavaScript "Ошибка произошла при получении даты", CRM 4.0 Буденый Dynamics CRM: Администрирование 0 16.10.2012 12:25
axforum blogs: Параметр TotalRecordCount и проблемы производительности. Как отключить подсчет количества записей в представлении Blog bot Dynamics CRM: Blogs 0 13.06.2012 22:11
Ошибка при запуске CRM через OutLook echo_igor Dynamics CRM: Функционал 0 26.11.2009 10:38
Отладка plug-in на сервере с сетевой рабочей станции alsherin Dynamics CRM: Разработка 2 27.07.2009 18:00
Параметр в отчет через URL slivka_83 Dynamics CRM: Разработка 5 23.05.2009 08:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:00.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.