c# - TimeZoneCode 到 TimeZoneInfo

标签 c# sql-server timezone dynamics-crm-2011

在我们的 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 的任何时区填充的内容。 CRM TimeZoneDefinition .

这将使偏差查找无效。

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

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

相关文章:

c# - 如何修复 Entity Framework Core 错误 "Value cannot be null. Parameter name: frameworkName"?

c# - Csvhelper 如何使用本地化创建自定义 header ?

c# - 将对象限制为几种类型

PHP/MySQL - 时区中的当前日期/时间

mysql - RHEL6服务器的系统时区对MySQL复制有什么影响?

c# - var 关键字并不总是有效?

sql-server - 如何实现高性能 Excel VSTO 到 SQL Server?

sql-server - 使用单个事务范围时获取 TransactionInDoubtException

sql-server - 由于公共(public) token 不匹配,从源运行 tSQLt 项目失败

java - 如何将日期时间从一个时区转换为另一个时区