| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Коллеги, помогите разобраться, я чета просто в ступоре. 
		
		
		
		
		
		
		
	Есть CRM 2011, есть веб-приложение (запускаю его локально со своего компа). Получаю значение даты из сущности, пробую делать это аж тремя разными способами: библиотеки microosft.xrm.sdk, SOAP-сервис, REST-сервис. Во всех случаях получаю дату в UTC... Как так? Почему UTC? Почему это не локальная дата пользователя и как таки получить локальную дату?  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			код в студию
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Читайте SDK!!!  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 X++: protected void Page_Load(object sender, EventArgs e) { const string DOMAIN = "..."; const string USER = "..."; const string PASS = "..."; const string ORG_NAME = "..."; const string CRM_SERVER_URL = "http://.../" + ORG_NAME; var eventId = new Guid("044220DB-1230-DE11-9DEE-00304894FA2D"); const string EVENT_ENTITY_NAME = "new_event"; const string ATTR_NAME = "new_startdate"; var eventColumns = new ColumnSet(new[] { ATTR_NAME }); var query = new QueryExpression("new_event") { ColumnSet = eventColumns, Criteria = new FilterExpression { FilterOperator = LogicalOperator.And } }; var condition = new ConditionExpression("new_eventid", ConditionOperator.Equal, new object[] { eventId }); query.Criteria.Conditions.Add(condition); var queryString = @" <fetch mapping='logical' version='1.0'> <entity name='new_event'> <attribute name='new_startdate' /> <filter> <condition attribute='new_eventid' operator='eq' value='" + eventId + @"' /> </filter> </entity> </fetch>"; DateTime date; using (var service = CreateDllCrmService(CRM_SERVER_URL, ORG_NAME, DOMAIN, USER, PASS)) { var @event = service.Retrieve(EVENT_ENTITY_NAME, eventId, eventColumns); date = @event.GetAttributeValue<DateTime>(ATTR_NAME); var events = service.RetrieveMultiple(query); date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME); events = service.RetrieveMultiple(new FetchExpression(queryString)); date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME); } { var client = CreateOrganizationServiceClient(DOMAIN, USER, PASS); var @event = client.Retrieve(EVENT_ENTITY_NAME, eventId, eventColumns); date = @event.GetAttributeValue<DateTime>(ATTR_NAME); var events = client.RetrieveMultiple(query); date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME); events = client.RetrieveMultiple(new FetchExpression(queryString)); date = events.Entities[0].GetAttributeValue<DateTime>(ATTR_NAME); client.Close(); } { var context = CreateOrganizationDataServiceContext(CRM_SERVER_URL, ORG_NAME, DOMAIN, USER, PASS); var events = (from evt in context.New_EventSet where evt.New_EventId == eventId select evt).ToArray(); date = events[0].New_StartDate.Value; } } private OrganizationServiceProxy CreateDllCrmService(string crmServerUrl, string orgName, string domain, string user, string pass) { var serverAndOrgName = crmServerUrl.EndsWith(orgName) ? crmServerUrl : crmServerUrl + "/" + orgName; var orgServiceUri = new Uri(serverAndOrgName + "/XRMServices/2011/Organization.svc"); var orgConfiguration = ServiceConfigurationFactory.CreateConfiguration<IOrganizationService>(orgServiceUri); var credentials = new ClientCredentials(); credentials.Windows.ClientCredential = new NetworkCredential(user, pass, domain); return new OrganizationServiceProxy(orgConfiguration, credentials); } private OrganizationServiceClient CreateOrganizationServiceClient(string domain, string user, string pass) { var client = new OrganizationServiceClient(); client.ClientCredentials.UserName.UserName = domain + @"\" + user; client.ClientCredentials.UserName.Password = pass; return client; } private atcContext CreateOrganizationDataServiceContext(string crmServerUrl, string orgName, string domain, string user, string pass) { var serverAndOrgName = crmServerUrl.EndsWith(orgName) ? crmServerUrl : crmServerUrl + "/" + orgName; var context = new atcContext(new Uri(String.Format("{0}/xrmservices/2011/organizationdata.svc/", serverAndOrgName), UriKind.Absolute)) { Credentials = new NetworkCredential(user, pass, domain) }; return context; } Во всех случаях возвращается дата в UTC, о чем говорит свойство Kind даты, а также сверка с тем, что реально храниться в SQL.  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		
		
		
		
		
		
		
			 
				__________________ 
		
		
		
		
	Читайте SDK!!!  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			У того юзера с полномочиями которого вы обращаетесь к серверу?
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Читайте SDK!!!  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Именно про него я и говорил.
		 
		
		
		
		
		
		
		
		
			Последний раз редактировалось ZooY; 27.03.2012 в 22:34.  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			У меня именно FormatedValues возвращает в нужном time zone всё остальное в UTC 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Читайте SDK!!!  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Но FormatedValues возвращает текст! Его конечно можно распарить в DateTime, но это чертовски не удобно... 
		
		
		
		
		
		
		
	И как так вообще получается? Я даю руку на отсечение, что получал даты в локальном формате (правда это было в другом проекте). Может есть какие то настройки?..  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
![]() А почему нельзя сделать расчеты в UTC (оно ведь у всех в UTC), а отображать в тексте? 
				__________________ 
		
		
		
		
	Читайте SDK!!!  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: mistah (1). | |
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Ну на самом деле можно довольно легко забыть что дата в UTC и от нее надо получать локальную дату или пользоваться форматированным значением. Кроме того меня гложет мысль что я таки получал даты в локальном формате и не понятно почему это работает в SL и не работает в веб-приложении. 
		
		
		
		
		
		
		
	А еще меня просто убивает ситуация. которую я наблюдал сегодня и с которой собственно у меня встал весь этот вопрос: [13:45:20] Смотрю через SQL Start Date: 2006-12-31 13:00:00 Start Date UTC: 2006-12-31 21:00:00... То есть дата была добавлена с часовым поясом -8 [22:40:15] Опять смотрю через SQL Start Date: 2007-01-01 01:00:00 Start Date UTC: 2006-12-31 21:00:00 То есть нормальный часовой пояс +4 И a CRM на форме отображались днем 31 декабря, а сейчас вечером уже 1 января, при том что дата в UTC осталась той же самой... Днем я выполнял этот запрос не один раз, я даже написал о результате коллеге скопировав данные. я не мог ошибиться... А сейчас все совсем по другому... Как жешь так?...  
		 | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Если получать данные из фильтрованных представлений, то дата будет в том поясе, от какого пользователя вы запускаетесь. Если получать из нефильтрованных представлений то будет время по грнивичу. Вы получаетее данные от имени пользователя. Какой у негочасовой пояс, то время и будет.
		 
		
		
		
		
		
		
			
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от g.Naukovych
			 
 
			Если получать данные из фильтрованных представлений, то дата будет в том поясе, от какого пользователя вы запускаетесь. Если получать из нефильтрованных представлений то будет время по грнивичу. Вы получаетее данные от имени пользователя. Какой у негочасовой пояс, то время и будет. 
		
	 | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			результат, выдаваемый FilteredView не зависит от времени на сервере. В частности сейчас на сервере часовой пояс +3, у пользователя +4 и данные выводятся именно с учетом этого. пользовательского пояса.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Может кто-то перевел время для этого пользователя. У вас должно быть +4, а было -8 разница в 12 часов. Может ошибся кто-нибудь из настроки?
		 
		
		
		
		
		
		
			
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Посмотрите modifiedby, modifiedon в этой вьюшке, может правда кто-то поменял, или с бекапом сравните..  | 
| 
	
 | 
| 
			
			 | 
		#19 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Согласен, а вот для клиенской машины того же сказать нельзя. Можно же заполнить дату на форме например, вызвав new Date() в JS. Не знаю как у вас там все выглядит.
		 
		
		
		
		
		
		
		
		
			Последний раз редактировалось lode; 28.03.2012 в 13:08.  | 
| 
	
 | 
| 
			
			 | 
		#20 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Блин, можно конечно все списать на какой то глюк, но на его "решение" потрачено полдня... обидно...  | 
| 
	
 | 
| Теги | 
| crm2011 | 
| 
	
	 | 
	
		
		
  |