SORU
27 HAZİRAN 2013, PERŞEMBE


Nasıl Windows ve IANA zaman dilimleri arasında çevirmek için?

the timezone tag wiki, açıklandığı gibi saat dilimleri iki farklı stilleri vardır.

  • Windows ile kullanmak için Microsoft tarafından sağlanan .TimeZoneInfo Net Sınıf Eastern Standard Time gibi bir değer ile tanımlanır.

  • Bu TZDB içinde IANA tarafından sağlanan America/New_York gibi bir değer ile tanımlanır.

Birçok İnternet tabanlı API IANA zaman dilimleri kullanın, ama çeşitli nedenlerle Windows saat dilimi kimliği, ya da tam tersi dönüştürmek.

Nasıl bu kadar başarılı olabilir .Net?

CEVAP
27 HAZİRAN 2013, PERŞEMBE


Windows ve IANA zaman dilimi tanımlayıcıları arasında dönüşüm için veri kaynağı the Unicode CLDR bir parçası.

Çoğu durumda, IANA zaman dilimi tek bir Windows saat dilimi eşlenebilir. Ama tersi doğru değil. Tek bir Windows saat dilimi birden fazla IANA zaman dilimi eşleştirilmiş olabilir.

Üstün bir tarih olmasının yanı sıra zaman API, Noda Time kütüphane CLDR eşlemeleri gömülü bir kopyasını içerir.

Aşağıdaki işlevleri dönüştürmek için kullanılabilir:

// This will return the Windows zone that matches the IANA zone, if one exists.
public string IanaToWindows(string ianaZoneId)
{
    var utcZones = new[] { "Etc/UTC", "Etc/UCT", "Etc/GMT" };
    if (utcZones.Contains(ianaZoneId, StringComparer.Ordinal))
        return "UTC";

    var tzdbSource = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default;

    // resolve any link, since the CLDR doesn't necessarily use canonical IDs
    var links = tzdbSource.CanonicalIdMap
        .Where(x => x.Value.Equals(ianaZoneId, StringComparison.Ordinal))
        .Select(x => x.Key);

    // resolve canonical zones, and include original zone as well
    var possibleZones = tzdbSource.CanonicalIdMap.ContainsKey(ianaZoneId)
        ? links.Concat(new[] {tzdbSource.CanonicalIdMap[ianaZoneId], ianaZoneId})
        : links;

    // map the windows zone
    var mappings = tzdbSource.WindowsMapping.MapZones;
    var item = mappings.FirstOrDefault(x => x.TzdbIds.Any(possibleZones.Contains));
    if (item == null) return null;
    return item.WindowsId;
}

// This will return the "primary" IANA zone that matches the given windows zone.
// If the primary zone is a link, it then resolves it to the canonical ID.
public string WindowsToIana(string windowsZoneId)
{
    if (windowsZoneId.Equals("UTC", StringComparison.Ordinal))
        return "Etc/UTC";

    var tzdbSource = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default;
    var tzi = TimeZoneInfo.FindSystemTimeZoneById(windowsZoneId);
    if (tzi == null) return null;
    var tzid = tzdbSource.MapTimeZoneId(tzi);
    if (tzid == null) return null;
    return tzdbSource.CanonicalIdMap[tzid];
}

UTC, eşleştirme için ayrı ayrı ele alınması olduğunu unutmayın. Bu CLDR yanlışlıkla haritalar ** 5, "Etc/GMT" UTC tzdb "Etc/UTC" bir bağlantı olarak kurulmamış olmasıdır. More on this here.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • JamesAtiPhone

    JamesAtiPhon

    16 EYLÜL 2010
  • Strata1000

    Strata1000

    28 EYLÜL 2009
  • Watcher3223

    Watcher3223

    15 Kasım 2007