【问题标题】:Get local time for a user获取用户的当地时间
【发布时间】:2014-02-25 08:02:17
【问题描述】:

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

我将为每个用户设置偏移量,并且我正在检查夏令时条件,如下所示:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我将有每个用户的偏移量

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

    您应该有一个用户的时区 ID。然后你可以使用:

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

    作为一个大型插件,您可能还想考虑使用我的Noda Time 库,它支持TimeZoneInfo (BCL) 时区,以及几乎所有Windows 以外的系统都使用的TZDB/IANA time zones。它还避免了DateTime 的一些nasty design decisions

    在 Noda Time 中,代码如下所示:

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

    (其中clockIClock 类型,这也提供了更好的可测试性...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多