在我们的 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/