2009-01-14 7 views
25

Je voudrais avoir une liste de tous les fuseaux horaires disponibles sur une machine Windows. Comment puis-je faire cela dans .NET?Comment puis-je énumérer tous les fuseaux horaires dans .NET?

Je sais au sujet de la méthode TimeZoneInfo.GetSystemTimeZones, mais cela ne retourne que le fuseau horaire sélectionné (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

Souffrant de coupe-n -paste-itis? :) Vous êtes déjà en train d'itérer tout au long de l'énumération mais en filtrant les décalages qui ne sont pas les mêmes que l'actuel avec l'instruction if. – Spoike

+0

J'ai oublié le si dans le code :( – gyurisc

Répondre

41

Non, il n'a pas, il retourne chaque fuseau horaire de la machine Windows connaît (en mon installation, c'est 91). La déclaration if que vous avez là est ce qui limite votre sortie. Sortez-le mais laissez la partie Console.WriteLine, et vous verrez les 91 fuseaux horaires (ou plus).

par exemple.

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

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

Cela devrait écrire 91 fuseaux horaires sur votre console.

+0

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

4

Votre code fonctionne bien pour moi. Voici la sortie sur ma boîte:

Vous pourriez être dans le temps suivant zones: (GMT) Casablanca (GMT)
Greenwich Mean Time: Dublin,
Edimbourg, Lisbonne, Londres (GMT)
Monrovia, Reykjavik

C'est tous ceux qui ont le même décalage pour le moment, ce qui est ce que votre code affiche clairement - si vous voulez tous les fuseaux horaires, il suffit de retirer le « si » une partie, comme le dit Robert.

Si vous pensez que vous devriez voir plus de zones, pourriez-vous nous dire dans quel fuseau horaire vous vous trouvez afin que nous puissions déterminer quels autres devraient être affichés?

3

Cette méthode est utilisée pour lier tous les fuseaux horaires dans Dev Express Drop Down. J'espère que cela aidera pour quelqu'un.

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 vouloir une sortie JSON d'un appel 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; 
     } 
    } 
} 

utiliser ensuite dans WebAPI:

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

Sortie:

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