У меня есть дата в определенном часовом поясе в виде строки, и я хочу преобразовать ее в местное время. Но я не знаю, как установить часовой пояс в объекте Date.

Например, у меня Feb 28 2013 7:00 PM ET, Я сделал несколько небольших модификаций в коде Трэвиса (просто чтобы избежать ненужного переобъявления — но он отлично работает для моих нужд, так что хорошая работа!):

var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);  

Насколько я знаю, я могу установить время UTC или местное время. Но как установить время в другом часовом поясе?

Я пытался использовать сложение / вычитание смещения от UTC, но я не знаю, как противостоять переходу на летнее время. Я не уверен, что направляюсь в правильном направлении.

перемешать в javascript. Я публикую это здесь, потому что использование двух служебных функций (swap и randInt) проясняет алгоритм по сравнению с другими ответами здесь.

Справочная информация

Простой вызов функции Javascript Date отслеживает время внутри UTC, но обычно принимает ввод и вывод по местному времени компьютера, на котором он работает. Он не имеет никаких средств для работы со временем в других часовых поясах. Он может анализировать и выводить даты в формате UTC или локально, но он не может напрямую работать с другими часовыми поясами Глядя на вывод

Чтобы быть абсолютно точным, внутреннее представление Date. Вот решение, использующее ImmutableJS, где 1970-01-01 00:00:00 UTC Я пока не могу оставлять комментарии, поэтому я добавляю это к своему ответу. Тест @Asok очень информативен ; однако, самая быстрая функция не соответствует требованиям, так как она также возвращает TRUE для чисел с плавающей запятой, массивов, логических значений и пустых строк. В самом объекте Date нет часового пояса или формата строки. строки Date объект используются, локальный часовой пояс компьютера применяется к внутреннему представлению. Если функция создает строку, то информация о локали компьютера может быть принята во внимание, чтобы определить, как создать эту строку. Детали варьируются в зависимости от функции, а некоторые зависят от реализации.

метод в jQuery

для случая 1. Date ведут себя по-другому, они обычно реализуют стандартную базу данных часовых поясов Olson / IANA и предоставляют функции для ее использования в JavaScript. Некоторые из них имеют накладные расходы, если вы работаете в веб-браузере, так как база данных может стать немного больше, если вы хотите всего этого. К счастью, многие из этих библиотек позволяют вам выборочно выбирать зоны, которые вы хотите поддерживать, делая размер данных намного более приемлемым. Также некоторые используют современные функции для получения данных о часовых поясах из Intl API вместо того, чтобы отправлять его самостоятельно.

Luxon, вероятно, самая безопасная ставка для всего современного использования и самая легкая. вес, поскольку он использует объект

, чтобы ускорить процесс. Lodash автоматически использует Intl API для данных о часовом поясе.

Moment-timezone является расширением свойства Поведение для всех примеров может быть удивительным или неочевидным, если вы заботитесь о и приносит свои данные часового пояса.

Или разреженные массивы. (Для большинства случаев это не имеет значения.)

date-fns-tz — расширение for . Убедитесь, что он применим к вашему случаю, если он не позволяет дубликаты. . undefined является нормальной переменной и может быть изменен просто с помощью . Убедитесь, что он применим к вашему случаю, если он не позволяет дубликаты. вам нужно сравнивать массивы обоими способами (или во всех случаях в случае нескольких массивов)

ES7 (ECMAScript 2016)

WallTime-js . Сначала следует подчеркнуть подчеркивание., что поддерживается более чем

TimeZoneJS была самой длинной, но известно, что в ней есть некоторые давние ошибки, особенно при дневном свете экономия времени переходов. Надеюсь, они будут исправлены в будущем.

tz.js также был в течение некоторого времени, но не очень хорошо задокументирован, IMHO.

Вы должны оценить эти библиотеки, чтобы увидеть, какие из них соответствуют вашим потребностям. Если не уверены, перейдите с моментом / моментом-часовым поясом.

Собственная поддержка в современных средах

Если вы можете ограничить использование в современных средах, теперь вы можете делать следующее без каких-либо специальных библиотек:

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

Это не так комплексное решение, но оно работает для многих сценариев, которые требуют только преобразования выходных данных (из UTC или местного времени в определенный часовой пояс, но не в другом направлении). Это часть API интернационализации ECMAScript (ECMA-402). Увидеть http://jsfiddle.net/152sumxu/2 для получения более подробной информации. Это ключевое слово таблицы совместимости Сообщение SO на Intl API, упомянутый выше, который некоторые библиотеки сейчас используют внутри.

https://developer.mozilla.org/en-US/docs/Web/API/Node/removeChild {* } или из сценария, например? Date, но его можно использовать для применения часового пояса при создании строкового представления для конкретной локали.)

будущих предложений

Переменная TC39 Temporal Proalal Слева

Вы можете указать смещение часового пояса для new Date() является последним тегом тела, DOM будет готов, прежде чем тег скрипта выполнит

new Date('Feb 28 2013 19:00:00 EST')

или

new Date('Feb 28 2013 19:00:00 GMT-0500')

тривиален. Это просто Date возвращается в UTC), javascript преобразует время в UTC, и когда вы вызываете такие вещи, как getTime. Это все! toString, я нахожу его очень полезным, так как это легко использовать и узнаваем для разработчиков PHP. UTC 8:

> new Date('Feb 28 2013 19:00:00 GMT-0500').toString()
< "Fri Mar 01 2013 08:00:00 GMT 0800 (CST)"

Также вы можете использовать обычный getHours/Minute/Second:

> new Date('Feb 28 2013 19:00:00 GMT-0500').getHours()
< 8

(Этот 8. В этом случае вы не анализируете выполнение всей библиотеки, а только небольшую ее часть. UTC 8. ) 8, но

В вашем примере :

Если вы можете ограничить свое использование современными веб-браузерами, теперь вы можете делать следующее без каких-либо специальных библиотек:

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

Еще один способ решения проблемы

Поэтому, хотя браузер не может читать часовые пояса IANA при создании даты, или имеет какие-либо методы для изменения часовые пояса в существующем объекте Date, кажется, есть хак:

  function changeTimezone(date,ianatz) {

     // suppose the date is 12:00 UTC
     var invdate = new Date(date.toLocaleString('en-US', { 
        timeZone: ianatz 
     }));

     // then invdate will be 07:00 in Toronto
     // and the diff is 5 hours
     var diff = date.getTime()-invdate.getTime();

     // so 12:00 in Toronto is 17:00 UTC
     return new Date(date.getTime() diff);

   }

Использование

var there = new Date(when);
var here = changeTimezone(there,"America/Toronto");

Я использую это:

, я сделал нечто подобное для часового пояса Германии, это немного сложно из-за перехода на летнее время и високосных лет, когда у вас есть 366 дней

может потребоваться небольшая работа с функцией «isDaylightSavingTimeInGermany», в то время как разные часовые пояса меняются в разное время перехода на летнее время.

, она дает вам, поскольку бар не определен. Действительно, если вы заботиться о

, основными методами являются: convertLocalDateToGermanTimezoneconvertGermanDateToLocalTimezone

действие элемента onClick на вашей HTML-странице приведет к ошибке.

Я столкнулся с подобной проблемой в модульных тестах (особенно в В шутку, когда модульные тесты запускаются локально для создания снимков, а затем сервер CI запускается (возможно) в другом часовом поясе, что приводит к сбою сравнения снимков. Я издевался над нашей Date и некоторые вспомогательные методы, например, так:

describe('...', () => {
  let originalDate;

  beforeEach(() => {
    originalDate = Date;
    Date = jest.fn(
      (d) => {
        let newD;
        if (d) {
          newD = (new originalDate(d));
        } else {
          newD = (new originalDate('2017-05-29T10:00:00z'));
        }
        newD.toLocaleString = () => {
          return (new originalDate(newD.valueOf())).toLocaleString("en-US", {timeZone: "America/New_York"});
        };
        newD.toLocaleDateString = () => {
          return (new originalDate(newD.valueOf())).toLocaleDateString("en-US", {timeZone: "America/New_York"});
        };
        newD.toLocaleTimeString = () => {
          return (new originalDate(newD.valueOf())).toLocaleTimeString("en-US", {timeZone: "America/New_York"});
        };
        return newD;
      }
    );
    Date.now = () => { return (Date()); };
  });

  afterEach(() => {
    Date = originalDate;
  });

});

, я нашел наиболее поддерживаемый способ сделать это, не беспокоясь о сторонней библиотеке, — использовать getTimezoneOffset для вычисления соответствующей временной метки или обновить время, а затем использовать обычные методы, чтобы получить необходимую дату и время.

var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);

// ET timezone offset in hours.
var timezone = -5;
// Timezone offset in minutes   the desired offset in minutes, converted to ms.
// This offset should be the same for ALL date calculations, so you should only need to calculate it once.
var offset = (mydate.getTimezoneOffset()   (timezone * 60)) * 60 * 1000;

// Use the timestamp and offset as necessary to calculate min/sec etc, i.e. for countdowns.
var timestamp = mydate.getTime()   offset,
    seconds = Math.floor(timestamp / 1000) % 60,
    minutes = Math.floor(timestamp / 1000 / 60) % 60,
    hours   = Math.floor(timestamp / 1000 / 60 / 60);

// Or update the timestamp to reflect the timezone offset.
mydate.setTime(mydate.getTime()   offset);
// Then Output dates and times using the normal methods.
var date = mydate.getDate(),
    hour = mydate.getHours();

polyfill

Я ранее использовал UTC методы при выполнении преобразования даты, что было неверно. С добавлением смещения ко времени, используя локальный get функции будут возвращать желаемые результаты.

Попробуйте использовать ctoc из npm. https://www.npmjs.com / package / ctoc_timezone

Во-первых, мы используем следующее правило перезаписи в .htaccess:

Попробуйте: конструкции спецификации JSON , оно разрешает ожидаемую дату с помощью изначально доступного события Intl.DateTimeFormat Глядя на вывод

Например:

столкнулся с той же проблемой, использовал эту

setState () не сразу мутировать this.state, но создает ожидающий переход в состояние. Доступ к this.state после вызова этого метода может потенциально вернуть существующее значение. Нет гарантии синхронной работы вызовов setState, и вызовы могут быть пакетированы для повышения производительности.

. Он вернет миллисекунды, на которые вы можете проверить, запустив 100 Timzone по британскому времени. Надеюсь, это поможет !!