27

Windows マシンで利用可能なすべてのタイム ゾーンのリストが必要です。.NET でこれを行うにはどうすればよいですか?

TimeZoneInfo.GetSystemTimeZones メソッドについては知っていますが、これは現在選択されているタイム ゾーンのみを返します

DateTimeOffset current = DateTimeOffset.Now;
ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();
Console.WriteLine("You might be in the following time zones:");
foreach (TimeZoneInfo timeZoneInfo in timeZones)
{
   // Compare offset with offset for that date in that time zone
   if (timeZoneInfo.GetUtcOffset(current).Equals(current.Offset))
   {
        Console.WriteLine("   {0}", timeZoneInfo.DisplayName);
   }
}
4

4 に答える 4

43

いいえ、そうではありません。Windows マシンが認識しているすべてのタイム ゾーンを返します (私のインストールでは、91 です)。そこifにあるステートメントは、出力を制限しているものです。それを取り出してその部分を残すConsole.WriteLineと、91 (またはそれくらい) のタイムゾーンがすべて表示されます。

例えば

ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();

foreach (TimeZoneInfo timeZoneInfo in timeZones)
  Console.WriteLine("{0}", timeZoneInfo.DisplayName);

これにより、91 個のタイムゾーンがコンソールに書き出されます。

于 2009-01-14T05:58:17.663 に答える
5

あなたのコードは私にとってはうまくいきます。これが私のボックスの出力です:

次のタイムゾーンにいる可能性があります:(GMT)カサブランカ(GMT)
グリニッジ標準時:ダブリン、
エジンバラ、リスボン、ロンドン(GMT)
モンロビア、レイキャビク

現時点で同じオフセットを持つのはこれだけです。これは、コードが明確に表示するものです。すべてのタイムゾーンが必要な場合は、Robertが言うように、「if」の部分を削除するだけです。

より多くのゾーンが表示されるはずだと思われる場合は、他にどのタイムゾーンを表示するかを判断できるように、現在のタイムゾーンを教えてください。

于 2009-01-14T06:29:55.680 に答える
4

This method is used to bind all timezones in Dev express Drop Down. I hope it will help for Someone.

private void FillTimeZone(ASPxComboBox ddlTimeZone)
{   
   ddlTimeZone.DataSource = TimeZoneInfo.GetSystemTimeZones();   
   ddlTimeZone.DataBind();  
   ListEditItem oListEditItem=new ListEditItem();   
   oListEditItem.Text=Helper.SELECT;   
   oListEditItem.Value=Helper.SELECT;   
   ddlTimeZone.Items.Add(oListEditItem);   
   ddlTimeZone.SelectedIndex = 0;
}
于 2011-01-07T06:39:25.387 に答える
2

WebAPI 呼び出しからの json 出力が必要な場合:

using System;
using System.Collections.Generic;

namespace MyProject.ViewModels
{
    public class TimeZoneViewModel
    {
        public readonly List<CTimeZone> CTimeZones;

        public TimeZoneViewModel()
        {
            CTimeZones = new List<CTimeZone>();
            foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones())
            {
                var tz = new CTimeZone(z.Id, z.DisplayName, z.BaseUtcOffset);
                CTimeZones.Add(tz);
            }
        }

    }

    public class CTimeZone
    {
        public string Id { get; set; }
        public string DisplayName { get; set; }
        public TimeSpan BaseUtcOffset { get; set; }

        public CTimeZone(string id, string displayName, TimeSpan utcOffset)
        {
            Id = id;
            DisplayName = displayName;
            BaseUtcOffset = utcOffset;
        }
    }
}

次に、WebAPI で使用します。

[HttpGet("Api/TimeZones")]
public JsonResult GetTimeZones()
{
    return Json(new TimeZoneViewModel().CTimeZones);
}

出力:

[{
    "id": "Dateline Standard Time",
    "displayName": "(UTC-12:00) International Date Line West",
    "baseUtcOffset": "-12:00:00"
  },
  {
    "id": "UTC-11",
    "displayName": "(UTC-11:00) Coordinated Universal Time-11",
    "baseUtcOffset": "-11:00:00"
  },
  {
    "id": "Aleutian Standard Time",
    "displayName": "(UTC-10:00) Aleutian Islands",
    "baseUtcOffset": "-10:00:00"
  },
  {
    "id": "Hawaiian Standard Time",
    "displayName": "(UTC-10:00) Hawaii",
    "baseUtcOffset": "-10:00:00"
  },...
于 2016-07-13T15:30:59.850 に答える