Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在CRM 2013中,插件使用错误的时间获取日期,但UI不';我没有时间场。如何从日期中删除时间_C#_Dynamics Crm 2011_Dynamics Crm_Dynamics Crm 2013 - Fatal编程技术网

C# 在CRM 2013中,插件使用错误的时间获取日期,但UI不';我没有时间场。如何从日期中删除时间

C# 在CRM 2013中,插件使用错误的时间获取日期,但UI不';我没有时间场。如何从日期中删除时间,c#,dynamics-crm-2011,dynamics-crm,dynamics-crm-2013,C#,Dynamics Crm 2011,Dynamics Crm,Dynamics Crm 2013,我目前正在通过以下途径从CRM检索日期字符串 Entity dateDeliveryRequiredImage = (Entity)context.PostEntityImages["DeliveryRequired"]; 但由于某种原因,它确实起作用,它似乎是在检索我通过以下行创建CSV文件的时间 dateDeliveryRequiredImage["requestdeliverby"].ToString() 你知道时间是从哪里来的吗?因为没有地方可以输入时间(据说是晚上11点??) 更重

我目前正在通过以下途径从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"];
    }
private DateTime retrievelocialTimeFromutcTime(DateTime utcTime,IOR组织服务)
{
int?时区代码=检索当前用户设置(服务);
如果(!timeZoneCode.HasValue)
抛出新异常(“找不到时区代码”);
var请求=新的LocalTimeFromUtcTimeRequest
{
TimeZoneCode=TimeZoneCode.Value,
UtcTime=UtcTime.ToUniversalTime()
};
var response=(LocalTimeFromUtcTimeResponse)服务。执行(请求);
返回response.LocalTime;
//var utcTime=utcTime.ToString(“MM/dd/yyyy HH:MM:ss”);
//var localDateOnly=response.LocalTime.ToString(“dd-MM-yyyy”);
}
私人整数?检索当前用户设置(IOR组织服务)
{
var currentUserSettings=service.RetrieveMultiple(
新的QueryExpression(“用户设置”)
{
ColumnSet=新列集(“localeid”、“timezonecode”),
条件=新筛选器表达式
{
条件=
{
新的条件表达式(“systemuserid”,ConditionOperator.EqualUserId)
}
}
}).Entities[0].ToEntity();
返回(int?)currentUserSettings.Attributes[“timezonecode”];
}
请注意,与下面代码的区别如下所示:

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

return (int?)currentUserSettings.Attributes["timezonecode"]; 
})。实体[0]。实体();
返回(int?)currentUserSettings.Attributes[“timezonecode”];

CRM将在写入CSV之前删除的默认时间设置为:

DateTime dateAndTime = (DateTime)dateDeliveryRequiredImage["requestdeliverby"];
var date = dateAndTime.ToString("dd-MM-yyyy");
var date = dateAndTime.Date;
如果要将默认时间写入CSV。您可以按以下方式使用:

DateTime dateAndTime = (DateTime)dateDeliveryRequiredImage["requestdeliverby"];
var date = dateAndTime.ToString("dd-MM-yyyy");
var date = dateAndTime.Date;
Dynamics CRM 2011以UTC时间存储所有日期时间字段,因此通过使用“DateTime.UtcNow”方法,我们的日期将在访问数据库之前转换为UTC时间。例如,默认时间是12:00:00,在数据库中它将存储为11:00:00。这就是为什么你的插件会在晚上11点出现。当我们的用户通过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;
    }
//
///从UTC时间中检索本地时间。
/// 
/// 
/// 
专用日期时间检索VelocialTimeFromutcTime(日期时间utcTime,IOrganizationService)
{
int?时区代码=检索当前用户设置(服务);
如果(!timeZoneCode.HasValue)
抛出新异常(“找不到时区代码”);
var请求=新的LocalTimeFromUtcTimeRequest
{
TimeZoneCode=TimeZoneCode.Value,
UtcTime=UtcTime.ToUniversalTime()
};
var response=(LocalTimeFromUtcTimeResponse)服务。执行(请求);
返回response.LocalTime;
//var utcTime=utcTime.ToString(“MM/dd/yyyy HH:MM:ss”);
//var localDateOnly=response.LocalTime.ToString(“dd-MM-yyyy”);
}
/// 
///检索当前用户的时区代码和区域设置id
/// 
私人整数?检索当前用户设置(IOR组织服务)
{
var currentUserSettings=service.RetrieveMultiple(
新的QueryExpression(“用户设置”)
{
ColumnSet=新列集(“localeid”、“timezonecode”),
条件=新筛选器表达式
{
条件=
{
新的条件表达式(“systemuserid”,ConditionOperator.EqualUserId)
}
}
}).Entities[0].ToEntity();
返回currentUserSettings.TimeZoneCode;
}

Ref:

我能理解问题所在,请您详细解释一下。如果你能分享插件代码也会很有帮助。当我把postentityimage输入一个字符串,准备输出到CSV文件时,我会得到一个日期和时间,但是我需要的只是日期。我的插件代码相当大,不觉得有必要将其全部发布在那里,只需要上面所需的代码,但是如果您愿意,我可以为您更改它?好的,我理解这个问题。正在为您提供默认时间。您好,感谢您的帮助,您的代码已删除了时间,但奇怪的是,它将日期从我选择的日期推迟了一天,任何建议@Scorpion在删除日期部分之前,请将UTC时间转换为本地时间。它将解决问题。请检查我的更新代码。您的默认时间为12分钟夜间,当系统将其转换为UTC时,其时间比前一天晚一小时(前一天晚上11点)。这导致了日期的差异。在更新的代码中,我将UTC时间转换为您的本地时间,然后删除时间部分。现在您将获得正确的日期。嗨@Scorpion,我厌倦了以下内容,没有运气
DateTime dateAndTime=(DateTime)dateDeliveryRequiredImage[“requestdeliveryby”];时区.CurrentTimeZone.ToLocalTime(日期和时间);var date=dateAndTime.ToString(“dd-MM-yyyy”)查看鳕鱼