NET核心如何以独立于操作系统的方式获取所有时区+信息



我正在使用C#和构建一个Discord机器人。NET核心。这个机器人应该可以帮助我在时区之间转换时间。

目前,我有这个类:

class Resources
{
public static readonly HashSet<string> Timezones = new HashSet<string>(TimeZoneInfo.GetSystemTimeZones().Select(tz => tz.Id));
public static TimeSpan idToUTCOffset(string id)
{
var t = TimeZoneInfo.FindSystemTimeZoneById(id);
return t.GetUtcOffset(DateTime.Now);
}
}

因此,我有一个包含所有时区ID的容器和一个函数,该函数可以将这样的ID转换为相对于当前UTC时间的偏移量。

这种方法的问题是Timezones的内容非常依赖于运行机器人的操作系统
在我开发和测试的windows电脑上,我得到了一个很好的时区列表:"东部标准时间"、"欧洲标准时间"等。
在Raspbian上运行的树莓派上,我收到了一个不同的列表,它似乎是一个国家/城市的列表,比我的windows设备上的列表大得多,可读性也差得多。

我想得到一个所有时区及其详细信息的紧凑列表(DST的开始/结束或具有自动处理DST功能的对象),就像我在windows设备上得到的一样,但我希望它与操作系统无关,或者至少它应该在我的树莓派上工作。

有没有一种方法可以在中以独立于操作系统的方式获取所有时区的列表。NET核心

最后,我希望它能在我的树莓派上运行,但如果它能在任何操作系统下运行,那就很方便了。


EDIT:
这里有更多的上下文可以让我的问题更清楚:
我的discord机器人的想法是,当有人用命令询问时间时,机器人会返回一个以所有相关时区表示的时间表
我的团队中的每个成员都为自己分配了一个角色,该角色带有他们所在时区的名称,因此我通过分配给他们的角色从每个用户那里知道他们所在的时区。列表需要尽可能短,以便相关时间表尽可能短。例如,在我的不和中,有多个来自加拿大的人居住在同一时区,但不在同一个城市。如果我有加拿大每个城市的列表,那么我的表中会有很多多余的数据
最重要的是,discord支持的角色数量非常有限,所以我需要列表尽可能小。

使用TimeZoneConverter,以下内容将在任何平台上返回一致的结果:

  • 这将为您提供任何时区的当前UTC偏移量。id可以是来自任一OS:的

    TimeZoneInfo tz = TZConvert.GetTimeZoneInfo(id);
    TimeSpan offset = tz.GetUtcOffset(DateTime.UtcNow);
    
  • 这将列出所有Windows时区ID:

    var list = TZConvert.KnownWindowsTimeZoneIds;
    
  • 这将列出所有IANA时区名称:

    var list = TZConvert.KnownIanaTimeZoneNames;
    

您可能也有兴趣使用TimezoneNames来提供一个人类可读的显示名称列表,尽管它还不能提供您在Windows上从TimeZoneInfo.DisplayName中看到的确切的Windows显示名称。该功能已在积压工作中。

相关内容

  • 没有找到相关文章

最新更新