2009-01-14 13 views
25

Me gustaría tener una lista de todas las zonas horarias disponibles en una máquina con Windows. ¿Cómo puedo hacer esto en .NET?¿Cómo enumero todas las zonas horarias en .NET?

lo que sé sobre el método TimeZoneInfo.GetSystemTimeZones, pero esto sólo se devuelve la zona horaria seleccionada (s)

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); 
    } 
} 
+0

El sufrimiento de corte-n -paste-itis? :) Ya estás iterando a través de toda la enumeración pero filtrando las compensaciones que no son las mismas que las actuales con el enunciado if. – Spoike

+0

Pasé por alto el si en el código :( – gyurisc

Respuesta

41

No, no, devuelve todas las zonas horarias del equipo de Windows conoce (en mi instalación, eso es 91). La instrucción if que tiene allí es lo que limita su salida. Elimínalo, pero deja la parte Console.WriteLine y verás las 91 zonas horarias (más o menos).

p. Ej.

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

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

Debe escribir 91 zonas horarias en la consola.

+0

'timeZones.Count' = *** 135 *** – Kiquenet

4

Tu código funciona bien para mí. Aquí está la salida en mi caja:

es posible que en el siguiente tiempo zonas: (GMT) Casablanca (GMT)
hora media de Greenwich: Dublín,
Edimburgo, Lisboa, Londres (GMT)
Monrovia, Reykjavik

Eso es todo los que tienen el mismo desplazamiento en el momento, que es lo que muestra claramente su código - si quieres todo las zonas horarias, basta con retirar la parte "si", como dice Robert.

Si cree que debería ver más zonas, ¿podría decirnos en qué zona horaria se encuentra para que podamos determinar qué otras deben mostrarse?

3

Este método se utiliza para enlazar todas las zonas horarias en Dev Express Drop Down. Espero que ayude a Alguien.

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; 
} 
1

Si querer una salida JSON de una llamada 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; 
     } 
    } 
} 

luego usarlo en WebAPI:

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

Salida:

[{ 
    "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" 
    },... 
Cuestiones relacionadas