c# - .Net 时区验证的正确方法

标签 c# .net timezone

我有一个接受.Net(或Windows)时区ID作为字符串的方法:

public void SaveTimezoneId(string timezoneId) { ... }

您可能知道,.Net 中的时区是这样的字符串:
  • 阿拉伯标准时间
  • 俄罗斯标准时间
  • 加拿大中部标准时间

  • 等等

    在将它们保存到数据库之前,我需要一种方法来验证它们。我现在所做的看起来像这样:
        try
        {
            TimeZoneInfo.FindSystemTimeZoneById(timezoneId);
    
            CurrentUser.TimezoneId = timezoneId;
            context.SaveChanges();
    
            return JsonSuccess();
        }
        catch(Exception)
        {
            return JsonError("Invalid time zone");
        }
    

    但它完全打破了良好软件开发的主要原则之一:永远不要依赖异常。而且,异常(exception)是昂贵的。

    还有其他方法可以执行此检查并摆脱 try-catch 吗?

    谢谢。

    最佳答案

    首先,如果您没有替代方案,或者替代方案(也)成本很高,那么异常(exception)是要走的路。我不是要你停止寻找替代品,但不要禁止异常,它们和所有类型的代码一样都有自己的位置。

    但是,您还有其他选择,您可以调用 TimeZoneInfo.GetSystemTimeZones并自己进行查找:

    void Main()
    {
        var timeZones = TimeZoneInfo
            .GetSystemTimeZones()
            .ToDictionary(stz => stz.Id);
    
        TimeZoneInfo tz;
        if (timeZones.TryGetValue("UTC-11", out tz))
            tz.Dump();
        else
            Debug.WriteLine("No such timezone");
    }
    

    如果您只需要知道 id 是否有效:
    void Main()
    {
        var timeZoneIds = new HashSet<string>(TimeZoneInfo
            .GetSystemTimeZones()
            .Select(tzi => tzi.Id));
    
        timeZoneIds.Contains("UTC-11").Dump();
    }
    

    这两个都可以在 LINQPad 中进行测试.

    如果您需要多次查找/检查并且可以腾出一些内存来支付一些速度,您可以将字典/哈希集存储在调用之间安全的地方。

    关于c# - .Net 时区验证的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20681852/

    相关文章:

    c# - 如何使用 LINQ 查找特定属性的副本?

    C# 7 元组和 lambda

    .net - 递归泛型类型的实例化速度越慢,嵌套越深。为什么?

    php - UTC 问题,不知道如何解决它们(PHP/MySQL)

    c# - 使用 LINQ 获取字典中 ID 所在的所有结果

    c# - 取消异步调用 (IAsyncResult)

    .net - 从 .NET Web 服务返回多个图像

    .net - 如何将鼠标滚轮事件传输到 WindowsFormsHost?

    kendo-ui - Kendo UI Scheduler - 忽略时区

    javascript - 如何理解客户端脚本中时区的时钟时间