Как мне конвертировать дату и время 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");