在我们的 MS dynamics CRM 项目中,我们创建了批量用户上传。
批处理从 excel 文件中读取并批量上传用户。
该批次需要设置的一件事是时区代码。

在 excel 文件中,时区将写为例如“UTC+1”
CRM 使用的代码似乎是 SQL 服务器正在使用的时区代码,可以在 here 中找到。

映射这些的最干净的方法是什么?
到目前为止我的想法:

  • 硬编码转换存储
  • 以某种方式从 CRM 获取代码
  • 以某种方式从 SQL 中获取代码

  • 目前我们刚刚使用硬编码值实现了我们自己的转换类。
    有没有更好的办法?我们可以以某种方式利用 .net TimezoneInfo 类吗?

    更新
    为了获取所有 CRM 时区,我们执行了以下操作:
    var colSet = new ColumnSet(true);
    var query = new QueryExpression(TimeZoneDefinition.EntityLogicalName) { ColumnSet = colSet};
    var timeZoneDefs = service.RetrieveMultiple(query).Entities.Select(tz => tz.ToEntity<TimeZoneDefinition>());
    

    但似乎唯一填充的属性是 Id、Code、StandardName 和 UserInterfaceName。
    似乎只有 UI 名称包含我们正在寻找的偏移量。

    有没有办法确保加载了 Bias 属性?

    最佳答案

    这是我用来获取用户的 TimeZoneInfo 的代码。它根据名称从 CRM 中检索 TimeZoneDefinition,但我相信您可以通过与 excel 文件中的 UTC 偏移量匹配的偏差来查找它。

    public static TimeZoneInfo GetUserTimeZone(IOrganizationService service, Guid userId)
    {
        int timeZoneCode = 35; //default timezone to eastern just incase one doesnt exists for user
        var userSettings = service.Retrieve(UserSettings.EntityLogicalName, userId, new ColumnSet("timezonecode")).ToEntity<UserSettings>();
    
        if ((userSettings != null) && (userSettings.TimeZoneCode != null))
        {
            timeZoneCode = userSettings.TimeZoneCode.Value;
        }
    
        return GetTimeZone(service, timeZoneCode);
    }
    
    public static TimeZoneInfo GetTimeZone(IOrganizationService service, int crmTimeZoneCode)
    {
        var qe = new QueryExpression(TimeZoneDefinition.EntityLogicalName);
        qe.ColumnSet = new ColumnSet("standardname");
        qe.Criteria.AddCondition("timezonecode", ConditionOperator.Equal, crmTimeZoneCode);
        return TimeZoneInfo.FindSystemTimeZoneById(service.RetrieveMultiple(qe).Entities.First().ToEntity<TimeZoneDefinition>().StandardName);
    }
    

    编辑 - 偏差为空

    这可能只是我们的预置版 CRM,但这是它当前填充在 CRM 中的任何时区(-5、-6、-7 或 -8)。
    .

    这将使偏差查找无效。

    附带说明一下,我们 99% 的用户都在东部时间,但我们在加利福尼亚州有一些用户,到目前为止我还没有听说过任何问题。但现在我想知道我们是否在 DST 之前和之后费心测试这个......

    关于c# - TimeZoneCode 到 TimeZoneInfo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17083233/

    10-13 06:24