将 UTC 时间转换为 Javascript 中的本地时间,给出未来日期

Convert UTC time to local time in Javascript, giving future date

我从后端获取 created_at 时间戳,格式为 UTC,我需要在浏览器中呈现。我 在 Angular-7 中使用日期管道。在阅读了一些博客和 Whosebug 之后,我在下面编写了这个函数来获得正常的日期格式,我可以通过 angular 中的日期管道进行格式化。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/UTC

getDateFromUTC(dateString: string) {
    const date = dateString
      .split(" ")[0]
      .split("-")
      .map((number) => parseInt(number));
    const hours = dateString
      .split(" ")[1]
      .split(":")
      .map((num) => parseInt(num));

    const convertedDate = new Date(
Date.UTC(date[2], date[1], date[0], hours[0], hours[1],hours[2])
    );
    return convertedDate;
}
getDateFromUTC("22-12-2020 03:44:09 UTC")

我做错了什么?

date 对象中的月份从 0 开始。所以你的代码应该减少 1 个月。 Refer here.

Date.UTC(date[2], date[1] - 1, date[0], hours[0], hours[1],hours[2])

function getDateFromUTC(dateString) {
  const date = dateString
    .split(" ")[0]
    .split("-")
    .map((number) => parseInt(number));
  const hours = dateString
    .split(" ")[1]
    .split(":")
    .map((num) => parseInt(num));

  const convertedDate = new Date(
    Date.UTC(date[2], date[1] - 1, date[0], hours[0], hours[1], hours[2])
  );
  return convertedDate;
}
var localDate = getDateFromUTC('22-12-2020 03:44:09 UTC')
console.log(localDate.toString());

尽管如此,我不确定为什么您首先将日期放在字符串中。

输入的日期不是标准的 ISO 8601 日期格式YYYY-MM-DDTHH:mm:ss.sssZhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString

所以,你需要先解析它。这是我认为您可以在 moment.js.

的帮助下获得的信息

function getDateFromUTC(dateString) {
  const parts = dateString.split(' ');
  parts.pop();
  dateString = parts.join(' ');
  const d = moment.tz(
    dateString,
    'DD-MM-YYYY hh:mm:ss',
    'UTC'
  ); 
  return d.toDate().toString();
}

console.log(getDateFromUTC('22-12-2020 03:44:09 UTC'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.31/moment-timezone-with-data.js"></script>

它returnsTue Dec 22 2020, 09:14:09 GMT+0530 (India Standard Time)

浏览器将自动转换为协调世界时 (UTC) 格式。您不需要进行任何日期转换。

您的后端似乎没有根据 ISO 8601 标准返回正确的 UTC 格式(UTC 日期以 'Z' 结尾)。

UTC 的正确格式是

[yyyy]-[MM]-[dd]T[HH]:[mm]:[ss].[sss]Z

例如:

2020-12-22T03:44:09.000Z

有问题增加了一个月我不知道为什么

function getDateFromUTC(dateString) {
  //console.log(mydate);
  var medate = dateString;
  var day = dateString.substring(0, dateString.indexOf('-'));
  dateString = dateString.replace('-', '=')
  var month = dateString.substring(3, dateString.indexOf('-'))
  console.log(month)
  dateString = dateString.replace('-', '=')
  var year = dateString.substring(6, dateString.indexOf(' '))
  dateString = dateString.replace(' ', '=')
  var hour = dateString.substring(11, dateString.indexOf(':'))
  dateString = dateString.replace(':', '=')
  var minute = dateString.substring(14, dateString.indexOf(':'))
  dateString = dateString.replace(':', '=')
  var second = dateString.substring(17, dateString.indexOf(' '))
  medate = year+'-'+month+'-'+day+'T'+hour+':'+minute+':'+second;
  //let utcDate = new Date(year+month+day+'T'+hour+':'+minute+':'+second);
  let utcDate = new Date(medate)
  var mydate = new Date(Date.UTC(
    parseInt(year), 
    parseInt(month)-1, 
    parseInt(day), 
    parseInt(hour), 
    parseInt(minute), 
    parseInt(second),
    0
  ));
  //Apparently one month is added. I'm not sure why
  console.log(mydate)
  console.log(utcDate)
  
}
getDateFromUTC("22-12-2020 03:44:09 UTC");