【问题标题】:In CRM 2013 Plugin Getting dates with wrong time, however UI don't have time field. How to remove time from date在 CRM 2013 插件中获取错误时间的日期,但是 UI 没有时间字段。如何从日期中删除时间
【发布时间】:2014-08-24 19:27:08
【问题描述】:

我目前正在通过以下方式从 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"]; 

【问题讨论】:

  • 能理解是什么问题,能不能详细解释一下。如果你能分享插件代码也会很有帮助。
  • 当我将 postentityimage 输入到准备输出到 CSV 文件的字符串中时,我得到了日期和时间,但我只需要日期。我的插件代码比较大,不觉得把它都贴在里面,只有上面需要的代码,但是如果你愿意我可以为你更改?
  • 好的,我明白了这个问题。给你默认时间。

标签: c# dynamics-crm-2011 dynamics-crm dynamics-crm-2013


【解决方案1】:

CRM 将您可以在写入 CSV 之前删除的默认时间设置如下:

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

如果您想将默认时间写入 CSV。你可以使用如下:

var date = dateAndTime.Date;

Dynamics CRM 2011 以 UTC 时间存储所有 DateTime 字段,因此通过使用“DateTime.UtcNow”方法,我们的日期将在访问数据库之前转换为 UTC 时间。例如,默认时间为 12:00:00,在数据库中将存储为 11:00:00。这就是为什么你在你的插件中得到 11PM。当我们的用户通过 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;
    }

参考:Sample: Retrieve time zone information

【讨论】:

  • 嗨,谢谢你的帮助,你的代码已经删除了时间,但很奇怪的是它比我选择的日期晚了一天,任何建议@Scorpion
  • 在删除日期部分之前,将 UTC 时间转换为本地时间。它会解决问题。
  • 请检查我更新的代码。您的默认时间是晚上 12 分钟,当系统将其转换为 UTC 时,它的时间会晚一小时(前一天晚上 11 点)。这导致日期差异。在更新的代码中,我将 UTC 时间转换为您的本地时间,而不是删除时间部分。现在你会得到正确的日期。
  • 嗨@Scorpion,我厌倦了以下没有运气DateTime dateAndTime = (DateTime)dateDeliveryRequiredImage["requestdeliveryby"]; TimeZone.CurrentTimeZone.ToLocalTime(dateAndTime); var date = dateAndTime.ToString("dd-MM-yyyy");
  • 查看您现在发布的代码,找不到代码中的确切位置,否则会弄乱其他所有内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多