我遇到了事件和日历约会的问题。长话短说,我在悉尼有一个用户在罗马创建一个活动(所以活动的UTC将是悉尼的一个+10),用户将指定城市和时区(罗马+1)。当有人决定从莫斯科参加罗马活动时(+4),我希望他能看到偶数会发生的时间。因此,如果偶数是罗马时间的9:00到11:00,则用户应该在他的日历中看到12:00到15:00(+3)。我的问题是,在数据库中,日期保存为UTC 9:00 - 11:00,但是从偏移量+10(创建事件的用户所在的悉尼)开始,并且在城市旁边并指定了一些偏移量由这个用户我不知道如何修复日期。如果我从UTC运行一次无知的转换,我将获得3:00 - 5:00 AM,因为莫斯科的赔率为+4而悉尼+10。我的想法是检查localtimezone,从用户输入系统的数据中获取偏移量(例如,他将指定城市和+1)如果我手动进行减法(悉尼是+10,罗马是+1)我减去了9个小时,所以将是0:00到2:00Am)我将那个时间转换为utc并且从那里我应该能够将它移动到我想要的地方,但是在那种情况下可能是白天会破坏这个东西,因为我是无法确定城市是否处于白天的区域。
有人对此有什么想法吗?
答案 0 :(得分:0)
幸运的是,CRM可以很好地处理时区。
首先,您需要确保每个用户的个人资料都有适合其家庭位置的时区。这位于设置>选项和时区属性。
接下来,您希望专注于存储用户配置文件的相应UTC值。例如,如果我想在纽约下午2:00设置会议而我的个人资料是纽约 - 那么我将其设置为下午2:00。但是,如果我在加利福尼亚州下午2:00设置会议,并且我的CRM配置文件是纽约,那么我需要安排会议时间为下午5:00。
回到你关于罗马在上午9点举行活动的例子。来自悉尼的用户需要在晚上7点之前输入此内容。
为了让用户更直观,请保持位置下拉"罗马"并有两个时间字段。
下拉 - "罗马"与此字段关联的字段为您提供选择的UTC偏移(即+1)
时间字段1 - 表示当地时间的事件。用户将在上午9:00输入。
时间字段2 - 表示用户所在时区的事件时间。您可以查询用户的配置并确定它是+11(悉尼)。罗马的下降将为您提供+1。因此,从这两个中,您需要为字段2添加10小时并保存7:00 PM。
时间字段2是您实际寻找的内容,它将为人们提供各自时区内正确的活动时间。
答案 1 :(得分:0)
我找到了一个不完全清洁的解决方案,但它有效。基本上我将我约会的UTC时间移动到会议地点。我有偏移量和城市名称。它不是很干净,因为我正在寻找TimeZoneInfo的显示名称中的包含。
List<TimeZoneInfo> viableTimezones = new List<TimeZoneInfo>();
foreach (TimeZoneInfo timeZone in timeZones)
{
TimeSpan q = new TimeSpan(givenTimespawn);
if (timeZone.BaseUtcOffset == q && timeZone.DisplayName.Contains(CityVenue))
{
viableTimezones.Add(timeZone);
}
}
var endDate = new DateTime(Year, Month, Day, Hour, min, secs );
var actualEndUTC = TimeZoneInfo.ConvertTimeToUtc(endDate, viableTimezones[0]);
如果我这样做,我得到事件的UTC时间(我在crm中的那个需要从日期和时间组装,而不是移动到场地位置,最后我能够恢复UTC时间直接在ics文件中写一个。我发现最后一个简单的Z(Zulu),将UTC值给予日历约会,而不是移动到用户时区。