在我们的MS动态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属性?
答案 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的任何时区填充的内容。
这会使偏见查找为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)
编辑: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