Bor*_*ens 2 c# sql-server timezone dynamics-crm-2011
在我们的MS动态CRM项目中,我们创建了一个批量用户上传批次.
批处理从excel文件中读取并对用户进行大量上载.
该批次需要设置的一件事是时区代码.
在excel文件中,时区将被写为例如"UTC + 1"
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>());
Run Code Online (Sandbox Code Playgroud)
但似乎填充的唯一属性是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);
}
Run Code Online (Sandbox Code Playgroud)
这可能只是我们的CRM的前期版本,但这是它目前在CRM中为-5,-6,-7或-8的任何时区填充的内容.
.
这会使偏见查找无效.
另一方面,我们99%的用户都在东部时间,但我们在加利福尼亚州有一些用户,我还没有听说过任何问题.但现在我想知道在DST之前和之后我们是否打算对此进行测试......
| 归档时间: |
|
| 查看次数: |
7632 次 |
| 最近记录: |