Как перечислить все часовые пояса в .NET?
Я хотел бы иметь список всех часовых поясов, доступных на Windows Machine. Как это сделать в .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);
}
}
Ответы
Ответ 1
Нет, он не возвращает каждый часовой пояс, о котором знает компьютер Windows (в моей установке, это 91). Утверждение if
у вас есть то, что ограничивает ваш выход. Возьмите это, но оставьте часть Console.WriteLine
, и вы увидите все 91 (или так) часовые пояса.
например.
ReadOnlyCollection<TimeZoneInfo> timeZones = TimeZoneInfo.GetSystemTimeZones();
foreach (TimeZoneInfo timeZoneInfo in timeZones)
Console.WriteLine("{0}", timeZoneInfo.DisplayName);
Это должно выписать 91 часовой пояс на консоль.
Ответ 2
Ваш код отлично работает для меня. Здесь вывод на моем ящике:
Вы можете быть в следующий раз зоны: (GMT) Касабланка (GMT)
Среднее время по Гринвичу: Дублин,
Эдинбург, Лиссабон, Лондон (GMT)
Монровия, Рейкьявик
То, что все те с тем же самым смещением на данный момент, что ясно показывает ваш код, - если вы хотите все временные зоны, просто удалите часть "если", как говорит Роберт.
Если вы думаете, что должны видеть больше зон, не могли бы вы рассказать нам, в каком часовом поясе вы находитесь, чтобы мы могли определить, какие другие должны отображаться?
Ответ 3
Этот метод используется для привязки всех временных зон в Dev express Drop Down.
Надеюсь, это поможет кому-то.
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;
}
Ответ 4
Если вам нужен json-выход из вызова WebAPI:
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"
},...