# hexo 自动更新文章更新时间脚本
updateTime.js
文件的作用是遍历 hexo 下所有文章,如果文件最后修改时间和文章中的更新时间大于五分钟,那么将自动更新文章中的更新时间。
建议将 updateTime.js
放在 hexo 根目录 ./script
下,然后输入 node ./script/updateTime.js
命令。
注意此时工作目录为你的 hexo 博客根目录
updateTime.js
文件如下:
/* | |
批量更新修改时间 | |
博客自动更新文章的修改时间 | |
*/ | |
console.log('脚本开始运行..'); | |
const { log } = require("console"); | |
const fs = require("fs"); // 请求文件系统 | |
const path = require("path") | |
const Reg=/^updated:.*(?:'|")(.*)(?:'|")$/img; | |
const dir = './source/_posts' | |
excuteDir(dir) | |
function excuteDir(dirPath) { | |
fs.readdir(dirPath, function(err,files){ | |
var len=files.length; | |
var file=null; | |
for(var i=0;i<len;i++){ | |
file=files[i]; | |
let filePath = path.join(dirPath, file) | |
console.log("正在处理文件:",filePath); | |
fs.stat(filePath, function(err, stats){ | |
if(err) { | |
console.log('err', err); | |
return | |
} | |
if (stats.isFile()) { | |
if(filePath.indexOf(".md")>-1){ | |
console.log("开始处理更新时间:",filePath); | |
writeFileTime(filePath,fs); | |
} | |
} else { | |
console.log("递归文件夹:",filePath); | |
excuteDir(filePath) | |
} | |
}); | |
} | |
}); | |
} | |
/* | |
file: 读取时间的文件以及写入内容的文件 | |
fs: 文件系统 | |
*/ | |
function writeFileTime(file,fs){ | |
fs.readFile(file, 'utf8',function(err, data) { // 读取文件内容 | |
if (err) return console.log("读取文件内容错误:",err); | |
let data1 = data.substring(0, 500) | |
const data2 = data.substring(500, data.length) | |
//console.debug ("\n 文件"+file+"的内容:",data1); | |
let rm = data1.match(Reg) | |
if(rm && rm.length && rm.length > 0){ | |
// 如果匹配到 `updated` 字段 | |
let gDate = rm[0].split("'")[1] | |
console.log(file, " 定位updated ", gDate); | |
fs.stat(file,function(err, stats) { // 读取文件信息,创建时间等 | |
if (err) { | |
return console.log("读取文件信息错误:",err); | |
} | |
let updated = gDate.replace(/-/g,"/"); // 时间格式化为 2018/01/29 21:33:30 | |
if(new Date(stats.mtime).getTime()-new Date(Date.parse(updated))>1000*60*5){ // 只要修改时间和文章内 updated 时间差大于 1000 毫秒 * 60*5=5 分钟就触发更新 | |
var result = data1.replace("updated: '"+gDate+"'", "updated: '"+getFormatDate(stats.mtime)+"'"); // 替换更新时间 | |
//console.debug (file, "\n 写入时间:", result, "\n"); | |
let out = result + data2 | |
//console.log ("写入文件:", out, "\n"); | |
fs.writeFile(file, out, 'utf8', function(err) { // 写入新的文件内容 | |
if (err) return console.log("写文件错误:",err); | |
fs.utimes(file,new Date(stats.atime),new Date(stats.mtime),function(err){ // 还原访问时间和修改时间 | |
if (err) return console.log("修改时间失败:",err); | |
console.log(file,"成功更新时间"); | |
}); | |
}); | |
} | |
}); | |
} | |
}); | |
} | |
/* | |
timeStr: 时间,格式可为:"September 16,2016 14:15:05、 | |
"September 16,2016"、"2016/09/16 14:15:05"、"2016/09/16"、 | |
'2014-04-23T18:55:49' 和毫秒 | |
dateSeparator:年、月、日之间的分隔符,默认为 "-", | |
timeSeparator:时、分、秒之间的分隔符,默认为 ":" | |
*/ | |
function getFormatDate(timeStr, dateSeparator, timeSeparator) { | |
dateSeparator = dateSeparator ? dateSeparator : "-"; | |
timeSeparator = timeSeparator ? timeSeparator : ":"; | |
var date = new Date(timeStr), | |
year = date.getFullYear(),// 获取完整的年份 (4 位,1970) | |
month = date.getMonth(),// 获取月份 (0-11,0 代表 1 月,用的时候记得加上 1) | |
day = date.getDate(),// 获取日 (1-31) | |
hour = date.getHours(),// 获取小时数 (0-23) | |
minute = date.getMinutes(),// 获取分钟数 (0-59) | |
seconds = date.getSeconds(),// 获取秒数 (0-59) | |
Y = year + dateSeparator, | |
M = ((month + 1) > 9 ? (month + 1) : ('0' + (month + 1))) + dateSeparator, | |
D = (day > 9 ? day : ('0' + day)) + ' ', | |
h = (hour > 9 ? hour : ('0' + hour)) + timeSeparator, | |
m = (minute > 9 ? minute : ('0' + minute)) + timeSeparator, | |
s = (seconds > 9 ? seconds : ('0' + seconds)), | |
formatDate = Y + M + D + h + m + s; | |
return formatDate; | |
} |