在我们的 MS dynamics CRM 项目中,我们创建了批量用户上传。
批处理从 excel 文件中读取并批量上传用户。
该批次需要设置的一件事是时区代码。
在 excel 文件中,时区将写为例如“UTC+1”
CRM 使用的代码似乎是 SQL 服务器正在使用的时区代码,可以在 here 中找到。
映射这些的最干净的方法是什么?
到目前为止我的想法:
目前我们刚刚使用硬编码值实现了我们自己的转换类。
有没有更好的办法?我们可以以某种方式利用 .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/