如何在Javascript中将UTC/GMT日期时间转换为CST?(不是本地时间,始终为CST)

10

我面临的挑战是后端数据始终以UTC时间存储。我们的前端数据始终以CST时间呈现。我无法访问这个“黑匣子”。

我希望在我们的数据仓库中反映这一点。该数据仓库位于欧洲(CET)。因此,“本地”转换将无法起作用。

我想知道最简单,最直接的方法来准确地将UTC时间(我可以将其转换为时代毫秒或日期格式“2015-01-01 00:00:00”)转换为中央标准时间(根据夏令时,它比UTC时间晚5或6小时)。

我看到很多关于转换为“本地”时间的线程……再次强调,我不想要这个,也不想简单地减去6个小时,因为这样会在一年的一半时间里出错。

有人有任何想法吗?这似乎是一个非常常见的问题,但我已经搜索了一段时间,什么都没有找到。


2
如果您不反对使用插件,您可以了解一下moment js:http://momentjs.com/ - Branden Keck
我不明白你想要什么?你是想按照原样镜像日期,还是按照指定的时区来镜像? - Alaa M. Jaddou
我想将历史UTC日期时间转换为CST日期时间。就这样。 - user45867
6个回答

7
使用 moment.jsmoment-timezone 插件可以使这个任务变得简单。
// 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”可能意味着“中国标准时间”。(实际上有五种不同的解释)。

3
Moment对于像这样的简单任务来说太过沉重和不必要了,完全可以不用它。 - wa7d

5

您可以使用时区偏移量来确定应减去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>


嗯,我得试试这个。 - user45867
不错的尝试,但有缺陷。Date对象只能告诉你本地时区是否处于夏令时。夏令时在全球并非统一应用。 - Matt Johnson-Pint
你还在本地时区解释输入值,而不是在UTC中,并且在字符串中使用特定于语言环境的“MM/DD/YYYY”格式。此外,移动时间本身并不是调整时区的最安全方式。这些错误非常容易犯,尤其是在JavaScript中。好好看看moment.js - 它会让你的生活更轻松愉快。干杯! :) - Matt Johnson-Pint

1
也许你可以使用类似以下的内容。请注意,这只是一个示例,你可能需要根据自己的需求进行调整。
    let cstTime = new Date(createdAt).toLocaleString("es-MX", {
    timeZone: "America/Mexico_City" });

0
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");

0
您可以使用以下代码片段进行转换。
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);
}

-1
您可以使用以下代码片段。

// Get time zone offset for CDT or CST
const getCdtCstOffset = () => {
  const getNthSunday = (date, nth) => {
      date.setDate((7*(nth-1))+(8-date.getDay()));
      return date;
  }
  const isCdtTimezoneOffset = (today) => {
    console.log('Today : ', today);
    let dt = new Date();
    var mar = new Date(dt.getFullYear(), 2, 1);
    mar = getNthSunday(mar, 2);
    console.log('CDT Start : ', mar);
    var nov = new Date(dt.getFullYear(), 10, 1, 23, 59, 59);
    nov = getNthSunday(nov, 1);
    console.log('CDT End : ', nov);
    return mar.getTime()< today.getTime() && nov.getTime()> today.getTime();
  }
  var today = new Date()// current date
  if (isCdtTimezoneOffset(today)) {
    return -5
  } else {
    return -6
  }
}
let cstOrCdt = new Date();
cstOrCdt.setHours(cstOrCdt.getHours()+getCdtCstOffset())
console.log('CstOrCdt : ', cstOrCdt);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接