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'));
在 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'));