В плагине CRM 2013 получение дат с неправильным временем, однако в пользовательском интерфейсе нет поля времени. Как убрать время с даты

В настоящее время я получаю строку даты из CRM с помощью следующего

Entity dateDeliveryRequiredImage = (Entity)context.PostEntityImages["DeliveryRequired"];

Что действительно работает, однако по какой-то причине кажется, что я получаю время, когда я создаю файл CSV через следующую строку

dateDeliveryRequiredImage["requestdeliverby"].ToString()

Любая идея, откуда он получает время во-первых, поскольку нет места для ввода времени (и он говорит, что сейчас 11 вечера??)

А главное как от этого избавиться

Спасибо, Шон

Обновить

После вменения необходимого кода появились следующие ошибки

 if (!timeZoneCode.HasValue)
            return;

Требуется объект типа, конвертируемого в 'system.timeanddate'

var response = (LocalTimeFromUtcTimeResponse)_serviceProxy.Execute(request);

_serviceProxy не существует в текущем контексте

Мой код для службы выглядит следующим образом:

IPluginExecutionContext context = (IPluginExecutionContext)
            serviceProvider.GetService(typeof(IPluginExecutionContext));


        IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

Однако ввод службы или контекста ничего не сделал

Наконец новое QueryExpression(UserSettings.EntityLogicalName)

С пользовательскими настройками, не существующими в текущем контексте

Обновление кода теперь работает

private DateTime RetrieveLocalTimeFromUTCTime(DateTime utcTime, IOrganizationService service)
    {

        int? timeZoneCode = RetrieveCurrentUsersSettings(service);


        if (!timeZoneCode.HasValue)
            throw new Exception("Can't find time zone code");



        var request = new LocalTimeFromUtcTimeRequest
        {
            TimeZoneCode = timeZoneCode.Value,
            UtcTime = utcTime.ToUniversalTime()
        };

        var response = (LocalTimeFromUtcTimeResponse)service.Execute(request);

        return response.LocalTime;
        //var utcTime = utcTime.ToString("MM/dd/yyyy HH:mm:ss");
        //var localDateOnly = response.LocalTime.ToString("dd-MM-yyyy");
    }

    private int? RetrieveCurrentUsersSettings(IOrganizationService service)
    {
        var currentUserSettings = service.RetrieveMultiple(
        new QueryExpression("usersettings")
        {
            ColumnSet = new ColumnSet("localeid", "timezonecode"),
            Criteria = new FilterExpression
            {
                Conditions =
        {
            new ConditionExpression("systemuserid", ConditionOperator.EqualUserId)
        }
            }
        }).Entities[0].ToEntity<Entity>();

        return (int?)currentUserSettings.Attributes["timezonecode"];
    }

Обратите внимание, что отличие от приведенного ниже кода заключается в следующих строках;

}).Entities[0].ToEntity<Entity>();

return (int?)currentUserSettings.Attributes["timezonecode"]; 

person Sjharrison    schedule 03.07.2014    source источник
comment
Может понять в чем проблема, Можете ли вы объяснить это подробно. Также будет полезно, если вы поделитесь кодом плагина.   -  person Scorpion    schedule 03.07.2014
comment
Когда я ввожу postentityimage в строку, готовую для вывода в файл CSV, я получаю дату и время назад, однако все, что мне нужно, это дата. Код моего плагина довольно большой, и я не чувствовал необходимости публиковать его весь там, только необходимый код, который указан выше, однако я могу изменить его для вас, если хотите?   -  person Sjharrison    schedule 03.07.2014
comment
Хорошо, я понимаю проблему. Дает вам время по умолчанию.   -  person Scorpion    schedule 03.07.2014


Ответы (1)


CRM устанавливает время по умолчанию, которое вы можете удалить перед записью в CSV следующим образом:

DateTime dateAndTime = (DateTime)dateDeliveryRequiredImage["requestdeliverby"];
var date = dateAndTime.ToString("dd-MM-yyyy");

Если вы хотите записать время по умолчанию в CSV. вы можете использовать следующее:

var date = dateAndTime.Date;

Dynamics CRM 2011 хранит все поля DateTime во времени UTC, поэтому при использовании подхода «DateTime.UtcNow» наши даты будут преобразованы во время UTC перед попаданием в базу данных. Например, время по умолчанию 12:00:00, в базе данных оно будет сохранено как 11:00:00. Вот почему вы получаете 23:00 в своем плагине. Когда наши пользователи прочитают дату через CRM, она будет преобразована обратно в их местный часовой пояс, и пользователь будет правильно читать время.

ОБНОВЛЕНИЕ

IPluginExecutionContext context = (IPluginExecutionContext)
        serviceProvider.GetService(typeof(IPluginExecutionContext));


IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

// This retrieves the UTC time
DateTime dateAndTime = (DateTime)dateDeliveryRequiredImage["requestdeliverby"];

// This converts the UTC time to your local time
var localDate = RetrieveLocalTimeFromUTCTime(dateAndTime, service);

// It will give you the correct date
var date = dateAndTime.ToString("dd-MM-yyyy");

Чтобы преобразовать UTC в местное время. Пожалуйста, проверьте код ниже:

    /// <summary>
    /// Retrive the local time from the UTC time.
    /// </summary>
    /// <param name="utcTime"></param>
    /// <param name="service"></param>
    private DateTime RetrieveLocalTimeFromUTCTime(DateTime utcTime, IOrganizationService service)
    {
        int? timeZoneCode = RetrieveCurrentUsersSettings(service);

        if (!timeZoneCode.HasValue)
            throw new Exception("Can't find time zone code");

        var request = new LocalTimeFromUtcTimeRequest
        {
            TimeZoneCode = timeZoneCode.Value,
            UtcTime = utcTime.ToUniversalTime()
        };

        var response = (LocalTimeFromUtcTimeResponse)service.Execute(request);

        return response.LocalTime;
        //var utcTime = utcTime.ToString("MM/dd/yyyy HH:mm:ss");
        //var localDateOnly = response.LocalTime.ToString("dd-MM-yyyy");
    }

    /// <summary>
    /// Retrieves the current users timezone code and locale id
    /// </summary>
    private int? RetrieveCurrentUsersSettings(IOrganizationService service)
    {
        var currentUserSettings = service.RetrieveMultiple(
        new QueryExpression("usersettings")
        {
            ColumnSet = new ColumnSet("localeid", "timezonecode"),
            Criteria = new FilterExpression
            {
                Conditions =
        {
            new ConditionExpression("systemuserid", ConditionOperator.EqualUserId)
        }
            }
        }).Entities[0].ToEntity<UserSettings>();

        return currentUserSettings.TimeZoneCode;
    }

Ссылка: Пример: получение информации о часовом поясе

person Scorpion    schedule 03.07.2014
comment
Привет, спасибо за вашу помощь, ваш код удалил время, но довольно странно, что дата на один день отстает от того, что я выбрал, любые предложения @Scorpion - person Sjharrison; 04.07.2014
comment
Прежде чем удалить часть даты, преобразуйте время UTC в местное время. Это уладит проблему. - person Scorpion; 04.07.2014
comment
Пожалуйста, проверьте мой обновленный код. Ваше время по умолчанию — 12 минут ночи, когда система конвертирует его в UTC, время отстает на один час (23:00 предыдущего дня). Что вызывает разницу в дате. В обновленном коде я конвертирую время UTC в ваше местное время, а затем удаляю временную часть. Теперь вы получите правильную дату. - person Scorpion; 04.07.2014
comment
Привет @Scorpion, я безуспешно устал от следующего DateTime dateAndTime = (DateTime)dateDeliveryRequiredImage["requestdeliveryby"]; TimeZone.CurrentTimeZone.ToLocalTime(dateAndTime); var date = dateAndTime.ToString("dd-MM-yyyy"); - person Sjharrison; 04.07.2014
comment
Глядя на код, который вы разместили сейчас, не могу найти, где именно его поместить, чтобы он не испортил все остальное. - person Sjharrison; 04.07.2014
comment
Хорошо, появилось несколько ошибок, опубликую обновление в исходном сообщении, спасибо, @Scorpion. - person Sjharrison; 04.07.2014
comment
Ошибки только что были опубликованы, извините, должен был присутствовать на встрече - person Sjharrison; 04.07.2014
comment
В вашей команде есть разработчик C#? - person Scorpion; 04.07.2014
comment
ошибки очень простые. замените _serviceproxy на service в вашем коде. - person Scorpion; 04.07.2014
comment
Я пробовал и никаких изменений, все еще говорит, что не существует в текущем контексте - person Sjharrison; 04.07.2014
comment
убедитесь, что вы добавили эти ссылки. using Microsoft.Xrm.Sdk.Query; using Microsoft.Crm.Sdk.Messages; using Microsoft.Xrm.Sdk; Я обновлю код, чтобы сделать его более простым для вас. Но, если честно, я дал вам идею. Это зависит от вас, чтобы заставить его работать. ошибки не с кодом. Я могу гарантировать, что ваш код правильный. Убедитесь, что вы добавили необходимые ссылки и передаете правильные параметры. - person Scorpion; 04.07.2014
comment
Они также уже есть в моем коде, ценю ваши комментарии и время, потраченное на помощь. - person Sjharrison; 04.07.2014
comment
Пожалуйста, проверьте обновленный код. Надеюсь, он решит все ваши проблемы. - person Scorpion; 04.07.2014