适当的.Net时区验证方式

时间:2013-12-19 12:29:57

标签: 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");
    }

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

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

感谢。

1 个答案:

答案 0 :(得分:4)

首先,如果您没有替代方案,或者替代方案(也)代价高昂,那么例外是可行的方法。我不是要求你停止寻找替代方案,但是不要禁止例外,他们就像所有类型的代码一样。

但是,您有另一种选择,您可以致电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中进行测试。

如果你需要多次查找/检查并且可以节省一些内存来支付一些速度,你可以将字典/ hashset存储在两次调用之间。