1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
在 **ledger-cli** 里,“循环交易” 一般是指一种定期重复发生的交易,比如每周/每月的工资、房租、水电费、转账等。
Ledger 本身并不会像记账软件那样自动生成未来的交易,但它有两种机制可以支持这种场景:
---
## **1. 用 `~` 定义周期性交易(Periodic Transactions)**
Ledger 的 journal 文件可以直接写定期规则,让它在报表时自动扩展出这些交易。
语法大致是:
```ledger
~ every month on the 5th
Expenses:Rent 2000 CNY
Assets:Bank:ICBC
```
### 常用的周期表达式
,* `~ monthly` / `~ every month` → 每月
,* `~ weekly` / `~ every week` → 每周
,* `~ daily` / `~ every day` → 每天
,* 可以指定日期:`~ every month on the 15th`
,* 可以指定范围:`~ weekly from 2025/01/01 until 2025/12/31`
例如:
```ledger
~ every week
Expenses:运营商:中国联通 49.75 CNY
Assets:Bank:工商银行
```
这个不会直接写入账本,只会在你运行报表命令时自动计算这些交易的总额。
---
## **2. 生成实际交易(Materializing Periodic Transactions)**
如果你想让循环交易“落地”成普通交易(方便将来修改或导出),可以用 Ledger 自带的扩展功能:
```bash
ledger -f ledger.dat print --period "from 2025/01/01 to 2025/12/31"
```
配合 `--actual` 可以生成真实交易而不是仅显示。
也可以用 **ledger-autoschedule**(第三方脚本)将周期交易展开为实际的交易条目存到文件里。
---
## **3. 注意事项**
,* 周期交易不会自动影响期初余额,因为它是计算时临时展开的。
,* 如果你的循环交易金额会变化(比如水费),那最好生成实际交易手动调整。
,* Ledger 的日期计算遵循 `boost::date_time` 规则,复杂的周期需要测试一下(例如“每月最后一天”要用 `on last day of month`)。
---
如果你愿意,我可以帮你写一个 **可以在 ledger-cli 里自动生成全年循环交易的脚本**,这样 journal 文件里就是全部真实交易而不是临时规则。这样你就可以和普通账目一起查询和编辑。
你是想要这种**脚本生成法**还是**\~ every week**这种原生 Ledger 周期规则?
|