Получить все возможные часовые пояса от смещения UTC - PullRequest
0 голосов
/ 31 мая 2018

У меня есть следующее значение -
GMT -0800
Как получить список всех часовых поясов, разделяющих это смещение?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вот пример перечисления часовых поясов по смещению, стоит отметить, что смещение UTC для данного часового пояса изменяется из-за перехода на летнее время для многих зон.

<html>
<head>
<script src="https://code.jquery.com/jquery-3.3.1.slim.js"></script>
<script src="https://momentjs.com/downloads/moment.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone-with-data-2012-2022.js"></script>

<script>


function initialise() {

    $("#offsetSelector").on('change', function (event) {
       showTimeZones();
    });

    var startOffset = -12;
    var offsets = Array.from(Array(48).keys()).reduce((acc, val) => {
        acc.push(startOffset);
        startOffset += 0.5;
        return acc;
    }, []);

    offsets.forEach((offset) => {
        var selector = document.getElementById("offsetSelector");
        var el = document.createElement("option");
        el.textContent = offset;
        el.value = offset;
        selector.appendChild(el);
    });

    document.getElementById("offsetSelector").value = -8;
    showTimeZones();
}

function showTimeZones() {

    var utcOffset = $('#offsetSelector').val();
    var timeZones = moment.tz.names();

    var result = timeZones.filter((zone) => {
        var tz = moment.tz.zone(zone);
        /* We'll make the assumption we're looking for the offset outside of DST */
        var currentOffset = tz.utcOffset(new Date('2018-01-01'));
        return  (currentOffset === (-utcOffset*60));
    });

    $("#list").empty();
    console.log('Zones:');
    result.forEach((zoneName) => {
      console.log(zoneName);
      var ul = document.getElementById("list");
      var li = document.createElement("li");
      li.innerHTML = zoneName;
     // li.appendChild(document.createTextNode(zoneName));
      ul.appendChild(li);
    });
}

</script>

</head>
<body onLoad = "initialise()">
<b>Offset (hours):</b>
<select id="offsetSelector">
</select> 

<br/><br/><b>TimeZone list:</b><br/>
<ul id="list"></ul>
</body>
</html>

JSFiddle: https://jsfiddle.net/p9h5wgcr/

0 голосов
/ 31 мая 2018

Я отвечу на это в двух частях:

1) Найдите набор данных, который содержит имена часовых поясов и их смещения

Вы можете скомпилировать этот набор данных вручную.(возможно, используя данные из Википедии), в качестве альтернативы пакет NPM timezones.json выглядит подходящим.

2) Поиск в списке

Учитываядва входа: начальный часовой пояс и смещение (например, GMT & -8), вам необходимо:

  1. Поиск в наборе данных смещения исходного часового пояса (например, GMT is +0)

  2. Добавьте два значения вместе, например, GMT-8 => 0 - 8 = -8

  3. Отфильтруйте набор данных по значениям со смещениемиз -8

Пример:

Допустим, у вас есть содержимое timezones.json из пакета NPM выше в переменной timezones_file

const timezones = JSON.parse(timezones_file);

// Step 1 above
function findOffset(timezone) {
   const matches = timezones.filter( zone => zone.abbr === timezone );
   return matches ? matches[0].offset : null;
}

// Step 2 above
function findByOffset(offset) {
    return timezones.filter( zone => zone.offset === offset );
}

// Answer to your question, accepts a timezone (e.g. 'GMT') and offset (e.g. -8)
function getListOfTimezones(initial_timezone, initial_offset) {
    const new_offset = findOffset(initial_timezone) + initial_offset;
    return findByOffset(new_offset);
}
...