如何使用 date-fns 将“yyyy-MM-dd'T'HH:mm:ss'GMT'Z”转换为 localDateTime

问题描述

我得到以下格式的日期时间

"yyyy-MM-dd'T'HH:mm:ss 'GMT'Z" // -> 2021-07-02T10:09:07:715 GMT+0000

我想将其转换为我的本地日期时间。我试图在 date-fns (javascript) 中做到这一点。

const createTime ="2021-07-02T10:09:07:715 GMT+0000";

console.log(parseISO(createTime.substring(0,19))); // -> 2021-07-02T04:09:07.000Z

  console.log(
    parseISO(createTime.substring(0,19)).toString()
  ); // -> Fri Jul 02 2021 10:09:07 GMT+0600 (Bangladesh Standard Time)
  
  // at that time my local DateTime as follow

  console.log(new Date()); // -> 2021-07-02T10:09:07.750Z

  console.log(new Date().toString()); // -> Fri Jul 02 2021 16:09:07 GMT+0600 (Bangladesh Standard Time)

但无论出于何种原因,它都没有转换为我的当地时间。

有没有其他方法可以将这种格式化的 DateTime 转换为本地日期时间?

如果有请帮忙...

注意:我在 Node.js 中使用 date-fns..

解决方法

您不必对输入字符串做任何事情,您只需要使用 right parse tokens 和格式。 OP有:

"yyyy-MM-dd'T'HH:mm:ss 'GMT'Z"

如果输入字符串为“2021-07-02T10:09:07:715 GMT+0000”,则会出现以下错误:

  1. 缺少小数秒部分和分隔冒号的标记
  2. “Z”是偏移量的错误标记,应该是“X”

所以正确的解析标记是:

"yyyy-MM-dd'T'HH:mm:ss:SSS 'GMT'X"

可以在 npm.runkit.com 运行的示例:

let parse = require('date-fns/parse');
let d = parse('2021-07-02T10:09:07:715 GMT+0000',"yyyy-MM-dd'T'HH:mm:ss:SSS 'GMT'X",new Date());
console.log(d.toISOString());

或者,您可以自己解析字符串,例如

function parseSpecial(s) {
  // Get the parts of the timestamp
  let [y,m,d,H,M,S,ms,offset] = s.match(/\d+|a-z+|[+-]\d{4}$/g);
  // Get the offset sign
  let offSign = offset.substr(0,1)
  // Convert offset to minutes
  let offMins = (offset.substr(1,2)*60 + +offset.substr(3,2)) * (offSign == '+'? 1 : -1);
  // Create a Date,adjusted by the offset
  return new Date(Date.UTC(y,m-1,M-offMins,ms));
}

['2021-07-02T10:09:07:715 GMT+0000','2021-07-02T10:09:07:715 GMT+0530','2021-07-02T10:09:07:715 GMT-0400'
].forEach(s => console.log(parseSpecial(s).toString()));