获取用户的当地时间

时间:2014-02-25 08:02:18

标签: c# visual-c++ timezone timezone-offset

我在VC ++中有一个应用程序,不同时区的不同用户使用它。我现在必须将此逻辑转换为C#。我对他/她的时区的日期格式感到满意。

我将为每个用户提供偏移量,我正在检查夏令时条件如下:

if (TimeZoneInfo.Local.IsDaylightSavingTime(DateTime.Now) && useroffset!=0)
                    {
                        useroffset += 1;
                    }

现在我的VC ++代码正在使用方法

                cdtDate = CComDATE(currentdate);
                cdtDate += CComSpan(0, useroffset, 0, 0);

我可以知道如何将其转换为C#。如果还有其他方法可以指导我。

1 个答案:

答案 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,这也提供了更大的可测试性...)