NodeJS (JavaScript) - 最快的日期转换方法?

NodeJS (JavaScript) - Fastest method to convert date?

在 NodeJS 中,我正在读取和解析一个超过 150 万行的 .txt 文件。每行的格式为:date,number,number,其中每个日期为 yyyyMMddhhmmss。示例行是:

20170506014255,100.01,200.02

使用jFile,我可以在大约 2 秒内读取和解析所有 1.5M+ 行...

var jFile = require('jfile');

var data = [];

var dataFile = new jFile('./dataFile.txt');

dataFile.lines.forEach(function(line) {
    data.push(line.split(','));
});

效果很好!但是,我想将日期格式更改为其他格式。为此,我使用 date-format 进行转换...

... same as previous, with new line within forEach() ...

var dateFormatter = require('date-format');

dataFile.lines.forEach(function(line) {
    let tdata = line.split(',');
    tdata[0] = dateFormatter('MM/dd/yy hh:mm:ss', dateFormatter.parse('yyyyMMddhhmmss', tdata[0]));
    data.push(tdata);
});

再说一次,这很好用!大多。 以前只需要 2 秒的操作现在大约需要 25 秒。 喘气!

理想情况下,文件的日期格式应该正确,但这不是我能控制的。

有没有更快的方法来进行这种转换?也许有更原生的方法,或者只是更快的包?

感谢您的任何见解!

我想硬编码解析会更快:

 function fixFormat(date) {
  const yy = date.slice(2, 4);
  const MM = date.slice(4, 6);
  const dd = date.slice(6, 8);
  const hh = date.slice(8, 10);
  const mm = date.slice(10, 12);
  const ss = date.slice(12, 14);

  return `${MM}/${dd}/${yy} ${hh}:${mm}:${ss}`;
 }

或者真的很丑:

const y = 2, M = 4, d = 6, h = 8, m = 10, s = 12;
const pattern = fn => date => fn(p => date[p] + date[p + 1])

const fixFormat = pattern(p => p(M) + "/" + p(d) + "/" + p(y) + " " + p(h) + ":" + p(m) + ":" + p(s));

看来你想打个打高尔夫的游戏,看看谁能为你写出最快的代码。

任何解析字符串,创建日期,然后生成字符串的东西,如果它比重新格式化字符串的东西慢。 Jonas 的方法是有效的,而且可能足够快,但所有这些切片都必须付出代价。单场比赛应该会更快,但这取决于你:

// Convert a timestamp in yyyyMMddhhmmss format to MM/dd/yy hh:mm:ss
// where "hh" is assumed to be 24 hr
function formatDate(s) {
  var b = s.match(/\d\d/g);
  return `${b[2]}/${b[3]}/${b[1]} ${b[4]}:${b[5]}:${b[6]}`;
}

console.log(formatDate('20170506014255'));

我不知道这样会不会更快,但代码肯定少了很多。如果你真的想让它更快,创建一次正则表达式:

// Convert a timestamp in yyyyMMddhhmmss format to MM/dd/yy hh:mm:ss
// where "hh" is assumed to be 24 hr
var formatDate = (function() {
  var re = /\d\d/g;
  return function (s) {
    var b = s.match(re);
    return `${b[2]}/${b[3]}/${b[1]} ${b[4]}:${b[5]}:${b[6]}`;
  };
}());

console.log(formatDate('20170506014255'));