TimeZoneCode到TimeZoneInfo

时间:2013-06-13 09:08:42

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

在我们的MS动态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属性?

3 个答案:

答案 0 :(得分:8)

这是我用来获取用户的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

这会使偏见查找为null&amp;无效。

另一方面,我们99%的用户都在东部时间,但我们在加利福尼亚州有一些用户,我还没有听说过任何问题。但现在我想知道我们是否打算在夏令时之前和之后测试这个......

答案 1 :(得分:2)

如果您需要所有CRM时区及其相关SQL标识符的列表:我们编写了一个小程序来循环CRM中的所有选项并输出名称,分号,sql代码。

(GMT+10:00) Canberra, Melbourne, Sydney (Commonwealth Games 2006); 256 
(GMT-04:00) Georgetown, La Paz, Manaus, San Juan; 55 
(GMT) Greenwich Mean Time : Dublin, Edinburgh, Lisbon, London; 85 
(GMT+06:00) Ekaterinburg; 180 
(GMT+03:00) Baghdad; 158 
(GMT+06:00) Dhaka; 196 
(GMT-06:00) Guadalajara, Mexico City, Monterrey; 29 
(GMT+04:00) Abu Dhabi, Muscat; 165 
(GMT+02:00) Beirut; 131 
(GMT) Coordinated Universal Time; 92 
(GMT+10:00) Canberra, Melbourne, Sydney; 255 
(GMT+10:00) Brisbane; 260 
(GMT-01:00) Cape Verde Is.; 83 
(GMT+01:00) Brussels, Copenhagen, Madrid, Paris; 105 
(GMT+12:00) Auckland, Wellington; 290 
(GMT+2:00) Nicosia; 115 
(GMT+02:00) Athens, Bucharest; 130 
(GMT+13:00) Nukualofa; 300 
(GMT+10:00) Hobart; 265 
(GMT+04:00) Port Louis; 172 
(GMT+07:00) Novosibirsk; 201 
(GMT-03:30) Newfoundland; 60 
(GMT+03:30) Tehran; 160 
(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi; 210 
(GMT+02:00) Amman; 129 
(GMT-06:00) Central America; 33 
(GMT+08:00) Krasnoyarsk; 207 
(GMT-11:00) Coordinated Universal Time-11; 6 
(GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb; 100 
(GMT-05:00) Bogota, Lima, Quito; 45 
(GMT+10:00) Yakutsk; 240 
(GMT+04:00) Yerevan; 170 
(GMT+09:00) Osaka, Sapporo, Tokyo; 235 
(GMT+10:00) Guam, Port Moresby; 275 
(GMT+12:00) Fiji; 285 
(GMT+04:30) Kabul; 175 
(GMT-05:00) Eastern Time (US & Canada); 35 
(GMT+11:00) Vladivostok; 270 
(GMT-01:00) Azores; 80 
(GMT+02:00) Jerusalem; 135 
(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague; 95 
(GMT+07:00) Bangkok, Hanoi, Jakarta; 205 
(GMT-03:00) Buenos Aires; 69 
(GMT+09:00) Irkutsk; 227 
(GMT+12:00) Magadan; 281 
(GMT-03:00) Cayenne, Fortaleza; 70 
(GMT-07:00) Chihuahua, La Paz, Mazatlan; 12 
(GMT+02:00) Cairo; 120 
(GMT-08:00) Baja California; 5 
(GMT+12:00) Petropavlovsk-Kamchatsky - Old; 295 
(GMT+05:00) Tashkent; 185 
(GMT+03:00) Nairobi; 155 
(GMT-04:00) Atlantic Time (Canada); 50 
(GMT-12:00) International Date Line West; 0 
(GMT+03:00) Kaliningrad, Minsk; 159 
(GMT-02:00) Coordinated Universal Time-02; 76 
(GMT+02:00) Istanbul; 134 
(GMT+08:00) Perth; 225 
(GMT+13:00) Samoa; 1 
(GMT) Casablanca; 84 
(GMT+06:00) Astana; 195 
(GMT+09:30) Darwin; 245 
(GMT-04:30) Caracas; 47 
(GMT-10:00) Hawaii; 2 
(GMT+09:00) Seoul; 230 
(GMT+08:00) Kuala Lumpur, Singapore; 215 
(GMT-06:00) Guadalajara, Mexico City, Monterrey - Old; 30 
(GMT+06:30) Yangon (Rangoon); 203 
(GMT+04:00) Moscow, St. Petersburg, Volgograd; 145 
(GMT+02:00) Damascus; 133 
(GMT-07:00) Arizona; 15 
(GMT+04:00) Tbilisi; 173 
(GMT-09:00) Alaska; 3 
(GMT-03:00) Brasilia; 65 
(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna; 110 
(GMT-07:00) Chihuahua, La Paz, Mazatlan - Old; 13 
(GMT+08:00) Ulaanbaatar; 228 
(GMT-03:00) Greenland; 73 
(GMT+09:30) Adelaide; 250 
(GMT-02:00) Mid-Atlantic; 75 
(GMT+12:00) Coordinated Universal Time+12; 284 
(GMT+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius; 125 
(GMT+02:00) Harare, Pretoria; 140 
(GMT-05:00) Indiana (East); 40 
(GMT+01:00) West Central Africa; 113 
(GMT-08:00) Pacific Time (US & Canada); 4 
(GMT+05:00) Islamabad, Karachi; 184 
(GMT+11:00) Solomon Is., New Caledonia; 280 
(GMT+03:00) Kuwait, Riyadh; 150 
(GMT+08:00) Taipei; 220 
(GMT-03:00) Montevideo; 74 
(GMT+09:30) Adelaide (Commonwealth Games 2006); 251 
(GMT+10:00) Hobart (Commonwealth Games 2006); 266 
(GMT+05:30) Sri Jayawardenepura; 200 
(GMT+04:00) Baku; 169 
(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi; 190 
(GMT-06:00) Central Time (US & Canada); 20 
(GMT-07:00) Mountain Time (US & Canada); 10 
(GMT-06:00) Saskatchewan; 25 
(GMT-04:00) Cuiaba; 58 
(GMT-04:00) Asuncion; 59 
(GMT+01:00) Windhoek; 141 
(GMT-04:00) Santiago; 56 
(GMT+05:45) Kathmandu; 193 
Bahia Standard Time; 71 
(GMT) Monrovia, Reykjavik; 90 

答案 2 :(得分:0)

TimeZones:使用Dynamics CRM Web API:

编辑:Dynamics CRM使用Windows时区名称。 Javascript几乎肯定会使用IANA。添加Windows-> IANA映射库(例如windows-iana)可能会使此输出更加有用。

let channelVar = bot.guilds.cache.get('Guild-ID').channels.cache.get('Channel-ID');
channelVar.send("Hello World");

这将返回Dynamics CRM看到的时区数组,并带有匹配的IANA值。 //Get available timezone codes, as array const { findOneIana } = require("windows-iana"); await axios.get(`${crmAPIUrl}timezonedefinitions?$select=timezonecode,standardname,userinterfacename,bias`) .then(r => r.value) .then(arr => arr.map(i => ( { timezonecode: i.timezonecode, userinterfacename: i.userinterfacename, standardname: i.standardname, ianaTZ: findOneIana(i.standardname) ))) 值可以在其余的JS代码中使用。

ianaTZ