我在VC ++中有一个应用程序,不同时区的不同用户使用它。我现在必须将此逻辑转换为C#。我对他/她的时区的日期格式感到满意。
我将为每个用户提供偏移量,我正在检查夏令时条件如下:
if (TimeZoneInfo.Local.IsDaylightSavingTime(DateTime.Now) && useroffset!=0)
{
useroffset += 1;
}
现在我的VC ++代码正在使用方法
cdtDate = CComDATE(currentdate);
cdtDate += CComSpan(0, useroffset, 0, 0);
我可以知道如何将其转换为C#。如果还有其他方法可以指导我。
答案 0 :(得分:1)
我将为每个用户提供偏移量
这一切都打破了。您不能为每个用户设置偏移量,因为偏移量会随着时间的推移而变化 - 并且它们不会在相同的时间内发生变化。您当前的代码假定所有用户将与服务器的本地时区同时更改为DST。不同的时区在不同的时间表上发生变化,有些时区根本没有观察到DST。 (你似乎也假设如果用户的偏移为0,那么他们不观察DST,这对我来说不正确 - 我坐在欧洲/伦敦时区,目前UTC + 0,但将于2014年3月30日移至UTC + 1.)
您应该为用户设置时区ID。然后你可以使用:
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(userZoneId);
DateTime userLocalNow = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, zone);
作为一个庞大的插件,您可能还想考虑使用支持TimeZoneInfo
(BCL)时区的Noda Time库和几乎所有其他系统的TZDB/IANA time zones比Windows使用。它还避免了DateTime
的一些nasty design decisions。
在Noda Time中,代码如下所示:
DateTimeZoneProvider provider = DateTimeZoneProviders.Tzdb; // Or Bcl
ZonedDateTime userNow = clock.Now.InZone(provider[userZoneId]);
(其中clock
的类型为IClock
,这也提供了更大的可测试性...)