在我们的 MS Dynamics CRM 项目中,我们创建了一个海量用户上传批次。
该批处理从 Excel 文件读取并批量上传用户。
该批次需要设置的内容之一是时区代码。
在 Excel 文件中,时区将写为“UTC+1”
CRM 使用的代码似乎是 SQL 服务器正在使用的时区代码,可以找到here.
映射这些的最干净的方法是什么?
到目前为止我的想法:
- 对转换存储进行硬编码
- 以某种方式从 CRM 获取代码
- 以某种方式从 SQL 获取代码
目前我们只是用硬编码值实现了我们自己的转换类。
有没有更好的办法?我们可以以某种方式利用 .net TimezoneInfo 类吗?
Update
为了获取所有 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);
}
编辑 - 偏差为空
This could just be our on prem version of CRM, but this is what it is currently populated in CRM for any time zone that is -5, -6,-7, or -8.
.
这将使偏差查找无效。
顺便说一句,我们 99% 的用户都使用东部时间,但我们也有一些用户在加利福尼亚州,到目前为止我还没有听说任何问题。但现在我想知道我们是否愿意在 DST 之前和之后进行测试......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)