Как мне конвертировать дату и время UTC/ GMT в CST в Javascript? (не местный, CST всегда)

У меня есть проблема, когда данные бэкэнда всегда хранятся в формате UTC. Наши входные данные всегда представлены в CST. У меня нет доступа к этому "черному ящику".

Я хотел бы отразить это в нашем хранилище данных. Который базируется в Европе (CET). Так что "локальное" преобразование не будет работать.

Меня интересует самый простой, самый простой способ точного преобразования времени UTC (у меня оно может быть в миллисекундах эпох или в формате даты '2015-01-01 00:00:00') в центральное стандартное время. (что составляет 5 или 6 часов в зависимости от перехода на летнее время).

Я вижу много тем о переходе на "местное" время... опять же, я не хочу этого, и при этом я просто не хочу вычитать 6 часов, которые будут неправильными полгода.

У кого-нибудь есть идеи? Кажется, это очень распространенная проблема, но я долго искал и ничего не нашел.

6 ответов

Использование момента.js с надстройкой момент-часовой пояс упрощает эту задачу.

// construct a moment object with UTC-based input
var m = moment.utc('2015-01-01 00:00:00');

// convert using the TZDB identifier for US Central time
m.tz('America/Chicago');

// format output however you desire
var s = m.format("YYYY-MM-DD HH:mm:ss");

Кроме того, поскольку вы имеете в виду весь североамериканский центральный часовой пояс, вы должны сказать либо "Центральное время", либо "CT". Аббревиатура "CST" применительно к Северной Америке явно означает UTC-6, а аббревиатура "CDT" будет использоваться для UTC-5 в летнее время.

Будьте осторожны с сокращениями, хотя. "CST" может означать "Китайское стандартное время". (Это на самом деле имеет пять разных интерпретаций).

Вы можете использовать смещение часового пояса, чтобы определить, следует ли вычитать 5 или 6 часов.

var dateJan;
var dateJul;
var timezoneOffset;

var divUTC;
var divCST;

// Set initial date value
dateValue = new Date('10/31/2015 7:29:54 PM');

divUTC = document.getElementById('UTC_Time');
divCST = document.getElementById('CST_Time');
divUTC.innerHTML = 'from UTC = ' + dateValue.toString();

// Get dates for January and July
dateJan = new Date(dateValue.getFullYear(), 0, 1);
dateJul = new Date(dateValue.getFullYear(), 6, 1);

// Get timezone offset
timezoneOffset = Math.max(dateJan.getTimezoneOffset(), dateJul.getTimezoneOffset());

// Check if daylight savings
if (dateValue.getTimezoneOffset() < timezoneOffset) {
  // Adjust date by 5 hours
  dateValue = new Date(dateValue.getTime() - ((1 * 60 * 60 * 1000) * 5));
}
else {
  // Adjust date by 6 hours
  dateValue = new Date(dateValue.getTime() - ((1 * 60 * 60 * 1000) * 6));
}

divCST.innerHTML = 'to CST = ' + dateValue.toString();
<div id="UTC_Time"></div>
<br/>
<div id="CST_Time"></div>

Может быть, вы можете использовать что-то вроде следующего. Обратите внимание: это всего лишь пример, который вам может потребоваться настроить в соответствии с вашими потребностями.

          let cstTime = new Date(createdAt).toLocaleString("es-MX", {
    timeZone: "America/Mexico_City" });

Вы можете использовать приведенный ниже фрагмент кода для конвертации.

function convertUTCtoCDT() {
    var timelagging = 6; // 5 or 6
    var utc = new Date();
    var cdt = new Date(utc.getTime()-((1 * 60 * 60 * 1000) * timelagging));
    console.log("CDT: "+cdt);
}
let newDate = moment(new Date()).utc().format("YYYY-MM-DD HH:mm:ss").toString()
var m = moment.utc(newDate);
m.tz('America/Chicago');
var cstDate = m.format("YYYY-MM-DD HH:mm:ss");

Вы можете использовать приведенный ниже фрагмент кода

Другие вопросы по тегам