获取用户的本地时间



我在VC++中有一个应用程序,它被不同时区的不同用户使用。我现在必须把这个逻辑转换成C#。我对他/她的时区的日期格式很熟悉。

我将有每个用户的偏移量,我正在检查夏令时条件,如下所示:

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

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

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

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

我将为每个用户提供偏移量

这从一开始就被打破了。你不能为每个用户都有一个偏移量,因为偏移量会随着时间的推移而变化,而且它们不会在相同的时间都发生变化。您当前的代码假设所有用户都将在服务器的本地时区同时更改为DST。不同的时区在不同的时间表上变化,有些人根本不遵守夏令时。(你似乎还假设,如果用户的偏移量为0,那么他们就不会观测夏令时,这对我来说是不正确的——我所在的欧洲/伦敦时区目前为UTC+0,但将于2014年3月30日移至UTC+1。)

您应该为用户提供一个时区ID。然后你可以使用:

TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(userZoneId);
DateTime userLocalNow = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, zone);

作为一个巨大的插件,您可能还想考虑使用我的Noda时间库,它同时支持TimeZoneInfo(BCL)时区和TZDB/IANA时区,除了Windows之外,几乎所有系统都使用这些时区。它还避免了DateTime的一些令人讨厌的设计决策。

在Noda Time中,代码看起来是这样的:

DateTimeZoneProvider provider = DateTimeZoneProviders.Tzdb; // Or Bcl
ZonedDateTime userNow = clock.Now.InZone(provider[userZoneId]);

(其中clock属于IClock类型,这也提供了更大的可测试性…)

相关内容

  • 没有找到相关文章

最新更新