在间歇日记时间戳之间插入用时。如:
- 02:02
吃饭 - 10:12
睡觉 - 13:13
洗碗
触发插件后: - 02:02(8h10m)
吃饭 - 10:12(3h1m)
睡觉 - 13:13
洗碗
- 查找最近的时间戳:这个逻辑保持不变。
- 计算时间差:这个也没有变化。
- 插入时间差:现在,时间差会被插入在当前光标位置,而不是上一个时间戳后面。
- 插入当前时间戳:在当前光标位置的下一行插入当前时间戳。
- 更新光标位置:将光标定位到插入的当前时间戳后面。
- 保存文件:这个逻辑保持不变。
(无编程知识,问gpt半天,终于弄好了)
创建您的第一个插件 | Obsidian 插件开发文档 (luhaifeng666.github.io)
此此代码由gpt完成
// cd /d D:\GTXXEON\record\daily\obsidian\日记\.obsidian\plugins\obsidian-plugin-dev-vault
// npm run dev
import { App, Editor, MarkdownView, Plugin } from 'obsidian';
export default class TimeDifferencePlugin extends Plugin {
onload() {
this.addCommand({
id: 'calculate-time-difference',
name: 'Calculate Time Difference',
editorCallback: (editor: Editor, view: MarkdownView) => {
this.calculateTimeDifference(editor);
}
});
}
calculateTimeDifference(editor: Editor) {
const currentPosition = editor.getCursor();
const text = editor.getValue();
const lines = text.split('\n');
let lastTimestampIndex = -1;
let lastTimestamp = null;
// 查找最近的时间戳
for (let i = currentPosition.line; i >= 0; i--) {
const timeMatch = lines[i].match(/- (\d{2}:\d{2})/);
if (timeMatch) {
lastTimestamp = timeMatch[1];
lastTimestampIndex = i;
break;
}
}
// 计算时间差并在当前位置插入
if (lastTimestamp) {
const currentTime = this.getCurrentTimeFormatted();
const timeDifference = this.calculateTimeDifferenceFormatted(lastTimestamp, currentTime);
editor.replaceRange(` **<${timeDifference}>** \n`, currentPosition);
// 插入格式化的当前时间戳在下一行
const currentTimeFormatted = `- ${currentTime} <br> `;
const nextLinePosition = { line: currentPosition.line + 1, ch: 0 };
editor.replaceRange(currentTimeFormatted + '\n', nextLinePosition);
// 更新光标位置到插入的当前时间戳行末
editor.setCursor({ line: currentPosition.line + 1, ch: currentTimeFormatted.length });
}
// 修改后保存文件
this.app.workspace.getActiveFile().save();
}
getCurrentTimeFormatted() {
const now = new Date();
return now.getHours().toString().padStart(2, '0') + ':' + now.getMinutes().toString().padStart(2, '0');
}
calculateTimeDifferenceFormatted(startTime, endTime) {
const start = this.convertTimeToMinutes(startTime);
const end = this.convertTimeToMinutes(endTime);
let diff = end - start;
if (diff < 0) {
diff += 24 * 60;
}
return this.formatTime(diff);
}
convertTimeToMinutes(timeStr) {
const [hours, minutes] = timeStr.split(':').map(Number);
return hours * 60 + minutes;
}
formatTime(minutes) {
const hours = Math.floor(minutes / 60);
const mins = minutes % 60;
return `${hours.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}`;
}
}