编写在特定城市输出时间的方法的有效方法

时间:2014-09-25 19:28:26

标签: c# datetime timezone

好的,所以必须有一个更有效的方法来做到这一点,但我似乎有一点编码器的阻止。

我有一个文本框,允许用户进入城市并确定该城市的时间。我想按时区划分城市。这是我现有的代码可以正常工作:

string stringToCheck = cityBox.Text;
DateTime utc = DateTime.UtcNow;

对于山:

TimeZoneInfo MST = TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
DateTime mst = TimeZoneInfo.ConvertTime(utc, MST);
string[] zoneMST = { "denver","calgary","etc" };


foreach (string x in zoneMST)
{
     if (x.Contains(stringToCheck))
         {
           clockLabel.Content = mst.ToString("hh:mm tt");
         }
}

和中环:

TimeZoneInfo CST = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime cst = TimeZoneInfo.ConvertTime(utc, CST);
string[] zoneCST = { "kansas city","etc", };


foreach (string x in zoneCST)
{
     if (x.Contains(stringToCheck))
         {
           clockLabel.Content = cst.ToString("hh:mm tt");
         }
}

问题是我需要做185个城市(这就是我按时区分组的原因)并且有103个时区。

我的问题是,是否有更好的格式化方法可以防止我不得不为每个时区重复此代码?

2 个答案:

答案 0 :(得分:4)

您可以构建一个代表时区Dictionary<string,List<string>>的集合,然后是每个时区的城市:

var timeZoneDictionary = new Dictionary<string, List<string>>
{
     { "Mountain Standard Time", new List<string> { "Denver", "Calgary" } },
     { "Central Standard Time", new List<string> { "Kansas City" } }
};

一旦你拥有了它,你就可以轻松地完成并循环整个事情:

foreach(var kvp in timeZoneDictionary)
{
    if(kvp.Value.Any(city => city == stringToCheck))
    {
        var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(kvp.Key);
        var time = TimeZoneInfo.ConvertTime(utc, timeZoneInfo);
        clockLabel.Content = time.ToString("hh:mm tt");
        break;
    }
}

答案 1 :(得分:2)

编辑:用户最初将WPF作为标记

WPF示例怎么样?

这个需要更多的工作,但从长远来看它会得到回报。目标是让用户在城市中键入并返回该城市所在的区域到文本块。我们将在Xaml中使用转换器来完成这项工作。

的Xaml

从xaml开始工作的是用户输入和Xaml中的结果

<TextBox Name="UserInputCity" Text="{Binding City, UpdateSourceTrigger=LostFocus}"/>
<TextBlock Text="{Binding City, 
                 Converter={StaticResource ZoneConverter}, 
                 NotifyOnSourceUpdated=True}" />

或者屏幕上的第一个控件获取城市的用户输入,并将其绑定到ViewModel上的City(或当前数据上下文中的INotifyPropertyChanged属性)。以下控件是一个TextBlock控件,它将显示该城市所在的区域,这要归功于使用名为“ZoneConverter”的转换器或后面的代码。

<Window.Resources>
    <conv:TimeZoneConverter x:Key="ZoneConverter" />
</Window.Resources>

城市类

我们将创建一个我们的转换器将使用的City Class对象。它将保留城市名称和当前时区。请注意我们如何将UTC偏移量作为将来可以使用的枚举:

public class City
{
    public enum eZones
    {
        Central = 5,
        Mountain = 6,
    }

    public string Name { get; set; }
    public eZones Zone {  get; set; }

};

转换器

最后我们的转换器完成了繁重的工作:

public class TimeZoneConverter : System.Windows.Data.IValueConverter
{
    public static IList<City> Cities = new List<City>
    {
        new City() { Name= "chicago", Zone = City.eZones.Central },
        new City() { Name= "denver", Zone = City.eZones.Mountain },
        new City() { Name= "calgary", Zone = City.eZones.Mountain }
    };


    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string result = "???";

        if ((value != null) && (!string.IsNullOrWhiteSpace(value.ToString() )))
        {
            var city = Cities.FirstOrDefault(town => town.Name == value.ToString().ToLower());

            if (city != null)
                result = city.Zone.ToString();

        }

        return result;

    }

    public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

当在用户文本输入框中丢失焦点时,用户输入Denverdenver Mountain时会尽职尽责地显示此信息。转换器可以显示实际时间,而不是显示Mountain,但已经证明了该过程。

enter image description here