【问题标题】:Convert UTC time to local time in Javascript, giving future date在Javascript中将UTC时间转换为本地时间,给出未来日期
【发布时间】:2020-12-28 09:07:14
【问题描述】:

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

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

  • 问题:输出是未来的日期。
  • 输入:“22-12-2020 03:44:09 UTC”
  • 输出:“2021 年 1 月 22 日星期五 09:14:09 GMT+0530(印度标准时间)”

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

我做错了什么?

【问题讨论】:

  • UTC 日期会根据您的浏览器时区自动转换为本地时间(JS Date 对象)。不需要转换。仔细检查后端是否正确返回 UTC。
  • 好的。所以我在Angular中使用date pipe将日期格式化为created_at: {{ time | date:'medium' }}。直接在模板中使用 UTC 值会给出“无效日期”错误。
  • UTC 以“Z”结尾。看起来您的 BE 没有返回标准 ISO UTC。假设值正确,那么应该是:2020-12-22T03:44:09.000Z
  • 知道了。这是后端部分的错误。谢谢

标签: javascript angular utc


【解决方案1】:

date 对象中的月份从 0 开始。所以你的代码应该每月减少1Refer 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());

虽然,我不知道你为什么首先在字符串中有一个日期。

【讨论】:

  • 啊,很傻的一个。它从 0 开始。感谢您指出这一点。
【解决方案2】:

输入日期不是标准 ISO 8601 日期格式 YYYY-MM-DDTHH:mm:ss.sssZ https://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>

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

【讨论】:

  • 很高兴看到这种新方法。感谢分享。
【解决方案3】:

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

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

UTC 的正确格式是

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

例如:

2020-12-22T03:44:09.000Z

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多