7 个版本
0.10.5 | 2023年8月1日 |
---|---|
0.10.4 | 2023年3月30日 |
0.9.2 | 2023年3月13日 |
115 在 日期和时间
每月 36 次下载
185KB
4K SLoC
Jobber
跟踪个人工作时间的命令行工具。
内容
目的
我于2013年开始开发jobber,这是一个用Ruby脚本编写的程序,因为在我看来,常见的工时跟踪工具通常带有糟糕或过于复杂的用户界面。为了方便使用shell的用户,jobber的目标是通过命令行提供其功能。10年后,我仍然觉得它非常有用,尽管这个Ruby脚本非常方便,但它仍然充满了错误,即使它承诺了更复杂的功能,也无法实现。
2021年,我开始学习Rust,因此我决定用那种语言重写jobber,以获得一个真正工作且可持续提供所有功能的版本。经过多次尝试,我发现Rust是一个不错的选择,因为它对边缘情况更加挑剔,并且有一个很好的测试环境,可以防止任何隐藏的错误代码,这可能导致错误的会计。
经过几个月的编码,我现在可以推出一个可测试的第一个版本,它并不完美(我还有一些更多的想法想要实现),但似乎比原始的Ruby版本更有用、更安全。
安装
要安装jobber,您需要通过rustup安装Rust(请参阅https://rustup.rs),然后使用以下命令
▶ cargo install jobber
现在您可以在命令行中使用jobber了。
使用方法
jobber的理念是,您不需要UI,您不需要用鼠标或智能手机触摸屏将您所做的工作输入到表单中,这在大多数情况下对我来说似乎都很糟糕。
因此,总的来说,只需提供以下信息即可跟踪您的工作时间
- 开始工作的时间
- 完成工作的时间
- 关于您所做工作的信息
- 一些信息来分类您的工作(例如客户、主题)
就是这样。
输入工作时间
基本想法是提供这样的功能,使其易于使用命令行
jobber -s start_time -e end_time -m message -t tags
当然,开始一个工作并在之后完成它是有意义的。因此,您可以使用-s
开始一个工作,稍后再次调用jobber使用-e
完成它。通常,在您知道您所做的工作时,留下一条信息会更简单,因此您可以在完成工作后提供一条信息。标签也是如此。
如果每次都必须写入完整的日期和时间,那么提供开始和结束时间会变得很困难。因此,您可以将其缩短到所需的内容,例如,今天中午用12:00
表示,或者用没有时间表示“现在”。
让我们通过一个例子来说明。
开始新工作
我们使用-s
选项开始一个新工作
▶ jobber -s
Beginning new database file 'jobber.json'
Started new job:
Pos: 1
Start: Sat Mar 04 2023, 16:25
End: - open -
Saved database into file 'jobber.json'
如您所见,jobber告诉您它从当前目录中一个名为jobber.json
的新数据库开始,并已启动一个新工作,其结束时间尚未确定。它还向您保证已将更改写入该文件。
如果您使用的shell提供颜色,则开始时间将以绿色显示,结束时间将以紫色显示,以便更好地阅读,但在用Markdown格式编写的此README.md
中,遗憾的是无法可视化这些颜色。
我们可以使用--l
选项(也请参阅后面的查看列表部分)来检查我们所做的工作。
▶ jobber -l
Loaded database (1 entries) from file 'jobber.json'
Pos: 1
Start: Sat Mar 04 2023, 16:25
End: - open -
Hours: 0.25
Total: 1 job(s), 0.25 hours
Database unchanged.
Jobber 会打印出所有存储的作业列表,如您所见,这里有一个我们刚刚开始的新作业,由于已经过去了一段时间,所以作业小时数显示为四分之一小时。默认情况下,工作时间的计算分辨率为15分钟。这个分辨率可以改变(见下面的配置部分),但现在我们让它保持默认。
结束开放工作
因此,让我们结束这个作业,假设我们做了些有用的事情,并使用-e
选项来结束它。
▶ jobber -e
Loaded database (1 entries) from file 'jobber.json'
You need to enter a message about what you did to finish the job.
Finish input with empty line (or Ctrl+C to cancel):
Did some nice work
Modified job:
Pos: 1
Start: Sat Mar 04 2023, 16:25
End: Sat Mar 04 2023, 16:34
Hours: 0.15
Message: Did some nice work
Saved database into file 'jobber.json'
如您所见,jobber 检测到我们没有提供关于我们做了什么的描述,因此它要求我们输入一条消息。我们回复了Did some nice work
。消息可以是多行的,但现在我们只使用单行。
我们输入消息后,jobber 报告说它已修改了打开的作业,并将其以数据库中存储的当前状态写下。
因此,我们成功地完成了我们的第一个作业。
添加新工作
现在让我们添加我们今天早上做的另一个作业,当时忘记输入了。这次我们通过使用-s
和-
以及在命令行中提供时间和消息选项-
来输入消息,而不被询问。
▶ jobber -s 8:15 -e 10:45 -m "What I did this morning"
Loaded database (1 entries) from file 'jobber.json'
Added new job:
Pos: 2
Start: Sat Mar 04 2023, 08:15
End: Sat Mar 04 2023, 10:45
Hours: 2.5
Message: What I did this morning
Saved database into file 'jobber.json'
如您所见,这也做得非常出色。
返回工作
您可以用-
代替-
来继续一个作业。然后,将创建一个新的作业,就像使用-
一样,但新作业会自动使用上一个作业的消息和标签。这在你休息后继续工作非常有用。
持续时间
您可以使用-
提供作业的结束日期和时间,也可以使用-
来提供作业的持续时间(见持续时间部分关于持续时间格式的说明)。
标记工作
如果您想对作业进行分类(例如,将会议与编程作业区分开来)或您为多个客户工作,您可以使用标签来设置。
在创建作业时,只需添加选项-
并提供标签列表即可。
▶ jobber -s -t meeting -m "meeting about new design" -d 2:00
Loaded database (2 entries) from file 'jobber.json'
There is one warning you have to omit:
WARNING 1) You have used some tags ( meeting ) which are unknown so far. Continue if you want to create them.
Do you still want to add this job? (y/N)
y
Added new job:
Pos: 3
Start: Sun Mar 05 2023, 21:24
End: Sun Mar 05 2023, 23:24
Hours: 2
Tags: meeting
Message: meeting about new design
Saved database into file 'jobber.json'
在这里,jobber 询问我们是否要添加未知标签meeting
,我们通过输入y
回答了是。
添加后,标签会以不同的颜色显示,以便您容易区分它们(您在这里的Markdown文件中看不到这一点)。
您可以通过用逗号分隔来添加多个标签(例如,meeting,design
)。
您还可以使用标签来区分客户并为每个客户提供不同的配置(见配置部分)。
修改标记
当您使用-
或--edit
时,您可以使用-
和+
与标签名称一起修改标签,而不是一次性替换所有标签。
▶ jobber -b -d 1:00 -t +phone
Loaded database (3 entries) from file 'jobber.json'
There is one warning you have to omit:
WARNING 1) You have used some tags ( phone ) which are unknown so far. Continue if you want to create them.
Do you still want to add this job? (y/N)
y
Added new job:
Pos: 4
Start: Sun Mar 05 2023, 21:24
End: Sun Mar 05 2023, 23:24
Hours: 2
Tags: meeting , phone
Message: meeting about new design
Saved database into file 'jobber.json'
您可以将+
和-
用作前缀或后缀。使用后缀是强制性的,如果您以-
开始标签列表,因为jobber 会将其读取为可选参数!。
编辑工作
可以通过使用--edit [<POS>]
来编辑工作,然后添加一些-s
、-e
、-d
、-m
或-t
来更改单个属性。唯一可以强制更改为空白的属性是-t
。在-t
不指定标签的情况下,编辑时会删除标签。
▶ jobber --edit 2 -m "What I did early this morning"
Loaded database (3 entries) from file 'jobber.json'
Modified job:
Pos: 2
Start: Sat Mar 04 2023, 08:15
End: Sat Mar 04 2023, 10:45
Hours: 2.5
Message: What I did early this morning
Saved database into file 'jobber.json'
删除工作
您可以通过范围(就像您可以使用在-r
或-l
中)来删除工作,删除前将会询问确认。已删除的工作不会从数据库中移除,但会内部标记删除日期和时间(这是为了后续使用)。
任何已删除的工作都不会出现在任何报告中、导出或列表中。
▶ jobber --delete 3-6
Loaded database (138 entries) from file 'jobber.json'
There ist one warning you have to omit:
WARNING 1) You are about to delete job(s) at the following position(s): 3-6
Do you still want to add this job? (y/N)
y
Deleting job(s) at position(s): 3-6
Saved database into file 'jobber.json'
模拟运行
如果您正在使用jobber并且想要确保数据库不会被任何错误输入损坏,您可以使用-D
来执行所谓的Dry Run。
在Dry Run中,所有操作都像平常一样进行,但数据库不会被保存到文件系统。
▶ jobber -D --delete 3-6
Loaded database (138 entries) from file 'jobber.json'
There ist one warning you have to omit:
WARNING 1) You are about to delete job(s) at the following position(s): 3-6
Do you still want to add this job? (y/N)
y
Deleting job(s) at position(s): 3-6
DRY RUN: Changes were NOT saved into database file 'jobber.json'!
这个例子与上面相同(在删除工作部分),但最后一条消息告诉您,更改没有保存
。
可视化输入的工作
列出工作
让我们看看今天我们做了什么
▶ jobber -l
Loaded database (2 entries) from file 'jobber.json'
Pos: 1
Start: Sat Mar 04 2023, 16:25
End: Sat Mar 04 2023, 16:34
Hours: 0.25
Message: Did some nice work
Pos: 2
Start: Sat Mar 04 2023, 08:15
End: Sat Mar 04 2023, 10:45
Hours: 2.5
Message: What I did early this morning
Pos: 3
Start: Sun Mar 05 2023, 21:24
End: Sun Mar 05 2023, 23:24
Hours: 2
Tags: meeting
Message: meeting about new design
Total: 3 job(s), 4.75 hours
Database unchanged.
您可以看到jobber列出了我们做的三个工作。
按工作日报告
让我们使用报告选项-r
以更炫的方式显示这些信息
▶ jobber -r
Loaded database (2 entries) from file 'jobber.json'
3/2023
Day Sun Mon Tue Wed Thu Fri Sat Week
- - - 3 3
5 2 - - - - - - 2
12 - - - - - - - 0
19 - - - - - - - 0
26 - - - - - 0
Mar 2023: 5 hrs.
Total: 3 job(s), 5 hours
Database unchanged.
哇!现在您得到的是工作的月度报告。
让我解释一下如何阅读这个报告:报告的第一行显示了月份和年份3/2023
。
之后是一个表格,其中第一列显示了每一行的月份日期(除了第一行,总是1
)。
接下来七列显示了每天的工时。因为我是在星期六写这个README.md
,在sat
下,所以您看到我在星期六工作了3
小时,星期天工作了2
小时。
在最后一列中,总结了每周的工作时间,在表格的末尾,它说我们在整个3月份工作的时间相同,- 虽然在我们的例子中看起来没有用 - 最后它总结了所有显示工作的总工作时间。
筛选视图
您可以在-r
后面添加时间范围(请参阅下面的范围部分以了解格式)或使用-t
来通过时间或标签过滤工作。
选择数据库
通常jobber使用配置文件中列出的数据库(请参阅下面的配置部分)。使用-f
您可以覆盖要使用的数据库文件。
▶ jobber -f ~/my_jobber.json` [...]
日期、时间、持续时间和范围格式
日期和/或时间
日期和时间必须以以下格式之一输入
格式 | 类型 | 描述 | 示例 |
---|---|---|---|
m/ d/ y, H: M |
月份优先 | 日期和时间 | 1/31/2023,1:01 |
m/ d/ y |
月份优先 | 日期 | 1/31/2023 |
m/ d, H: M |
月份优先 | 不包含年份的日期和带时间 | 1/31,1:01 |
m/ d |
月份优先 | 不包含年份的日期 | 1/31 |
d. m. y, H: M |
日优先 | 日期和时间 | 31.1.2023,1:01 |
d. m. y |
日优先 | 日期 | 31.1.2023 |
d. m., H: M |
日优先 | 不包含年份的日期和带时间 | 31.1.,1:01 |
d. m. |
日优先 | 不包含年份的日期 | 31.1. |
y- m- d, H: M |
年优先 | 日期和时间 | 2023-1-31,1:01 |
y- m- d |
年优先 | 日期 | 2023-1-31 |
H: M |
- | 时间 | 1:01 |
时间格式内不允许有空格,并且日期和时间格式也可以互换为时间然后是日期。
如果日期或时间缺失,将使用当前时间。
如果一起给出开始和结束,只需定义一个日期。
持续时间
持续时间必须以以下格式之一输入
格式 | 类型 | 描述 | 示例 |
---|---|---|---|
H: M |
标准 | 小时和分钟 | 1:15 |
h, fr |
带逗号 | 小时和小时的分数 | 1,25 |
h. fr |
带小数点 | 小时和小时的分数 | 1.25 |
范围
时间或位置范围必须以以下格式之一输入
格式 | 描述 | 示例 |
---|---|---|
f- t |
从位置到位置 | 3-5 |
f- |
从位置开始 | 3- |
p | 单个位置 | 3 |
~ C |
计数(从末尾开始) | 10 |
s.. u |
从时间到时间 | 1/31,15:00..1.2. |
s.. |
从时间开始 | 1/31,15:00.. |
D | 单日 | 1/31 |
当使用“从时间到时间”或“从时间”格式与“不包含年份的日期”一起时,请记住三个点将位于中间(例如:31.1...1.2.
)。
导入和导出
遗留 CSV 导入
要从旧版本的 Ruby 的 jobber 导入旧数据库格式,可以使用 --legacy-import
▶ jobber --legacy-import ~/my_old_jobber.dat
Loaded database (2 entries) from file 'jobber.json'
Imported 125 jobs added new tags consult , meeting , my_client , training .
Saved database into file 'jobber.json'
Jobber 显示它已成功导入 125 项工作
,并且这次导入带来了四个新标签(再次说明:标签名称将被着色,但在这里的 Markdown 文本中不会)。
CSV 导出
使用选项 -E
,可以将数据库或其部分导出为 CSV 文件,例如从中创建发票。
▶ jobber -E
Loaded database (3 entries) from file 'jobber.json'
"Tags","Start","Hours","Message"
"","03/04/2023 08:15",2.5,"What I did early this morning"
"","03/04/2023 16:25",0.5,"Did some nice work"
"meeting","03/05/2023 21:24",2,"meeting about new design"
Database unchanged.
如你所见,默认输出是一个包含以下列的CSV文件: tags
、start
、hours
和 message
。
导出的条目会自动按开始日期和时间排序,方便您使用。
要将输出写入文件,请使用shell的管道功能(例如 jobber -E > out.csv
)
要更改要导出的列,可以使用选项 --csv
(可能的值有
短 | 名称 | 描述 |
---|---|---|
# |
pos |
位置 |
s |
start |
开始 |
e |
end |
结束 |
h |
hours |
小时 |
m |
message |
消息 |
t |
tags |
标签 |
p |
pay |
支付 |
- | max_hours |
最大小时 |
- | rate |
比率 |
- | resolution |
分辨率 |
▶ jobber -E --csv pos,start,end
Loaded database (3 entries) from file 'jobber.json'
"pos","start","end"
2,"03/04/2023 08:15","03/04/2023 10:45"
1,"03/04/2023 16:25","03/04/2023 16:34"
3,"03/05/2023 21:24","03/05/2023 23:24"
Database unchanged.
在这个例子中,我们只导出了每个工作的 pos
、start
和 hours
。
您还可以使用选项 -E
指定范围,就像您创建报告时一样
▶ jobber -E 3/4,0:00..12:00
Loaded database (3 entries) from file 'jobber.json'
"tags","start","hours","message"
"","03/04/2023 08:15",2.5,"What I did early this morning"
Database unchanged.
如您所见,现在只导出了一个工作。
警告
Jobber 对您的命令进行多个合理性检查。每当出现似乎不合适的情况时,您将收到警告,并会被询问是否仍要继续。
您要添加的工作与现有工作重叠
您即将添加一个与另一个工作在时间上重叠的工作。
▶ jobber -s 3/4,9:00 -e 10:00
Loaded database (3 entries) from file 'jobber.json'
There is one warning you have to omit:
WARNING 1) The job you want to add overlaps existing one(s):
Job you want to add:
Start: Sat Mar 04 2023, 09:00
End: Sat Mar 04 2023, 10:00
Hours: 1
Existing overlapping jobs:
Pos: 2
Start: Sat Mar 04 2023, 08:15
End: Sat Mar 04 2023, 10:45
Hours: 2.5
Message: What I did early this morning
Total: 1 job(s), 2.5 hours
Do you still want to add this job? (y/N)
Jobber 列出您即将添加的工作,然后是与之重叠的工作。
如果您开始一个工作(没有给出结束时间),并且开始时间早于任何现有工作,则假设结束时间可能是现在,因此您可能会收到警告。然后检查您的输入,如果这是故意的,回答 y
以继续或 n
以取消。
您使用了某些未知标记
使用选项 -t
您给出了某些当前未知的标签名称,然后 Jobber 会询问这是否是一个错误,或者您是否想添加新标签
▶ jobber -s -t consulting
Loaded database (3 entries) from file 'jobber.json'
There is one warning you have to omit:
WARNING 1) You have used some tags ( consulting ) which are unknown so far. Continue if you want to create them.
Do you still want to add this job? (y/N)
在这种情况下,标签 consulting
是未知的。
要列出已知的标签,可以使用选项 -T
(见 标签 部分)。
错误
数据库为空
您尝试继续一个现有工作,但数据库为空。
全局配置错误
您的配置(.config/jobber/config.toml
)中有一个错误。
I/O 错误
读取或写入文件失败。
JSON 错误
解析 JSON 错误,数据库文件可能已损坏。
还有一个开放的工作
您尝试开始一个新工作,但现在有一个开放的工作需要先结束,然后才能添加新工作。
没有开放的工作
您尝试结束一个开放的工作,但没有任何工作。
工作结束时间早于开始时间
结束和开始时间看起来顺序颠倒了。
用户取消
在询问后,您拒绝了一些内容。
同一工作内不能使用标记,因为它们的配置不同
您使用了具有不同配置的两个标签,这是不允许的。
用户需要输入消息
您需要输入一条消息,但没有输入。
未知列名
在将工作导出到CSV文件时,您声明了一个未知的列名(只有 pos
、start
、end
、hours
、message
和 tags
是可用的)。
输出文件已存在
尝试写入已存在的输出文件。
日期/时间解析错误
日期和或时间的解析错误。
在指定位置未找到工作
您给出的是一个不在数据库中的位置。
需要一个值
需要为 '-t ' 输入一个值,但没有提供。
数据库中的工作太少,无法处理范围内的操作
您给出的是一个超出数据库范围的定位范围。
范围解析失败
您给出的是一个无法解析的范围。
持续时间解析失败
您给出的是一个无法解析的持续时间。
部分日期和时间的解析失败
您给出的是一个无法解析的部分日期和时间。
配置
数据库位置
在第一次启动时,Jobber 创建一个配置文件(通常在您的家目录中的 .config/jobber/config.toml
)。
该文件当前只有一个条目,即
database = 'jobber.json'
如果您想将数据库放在其他地方,请更改数据库路径。
数据库内部配置
在jobber数据库中有一些设置可能需要更改
- 工作时间解析度
- 您的时薪
- 每天最大工作时间
在jobber中,有一个基本配置,但您也可以通过在更改设置时添加带有-t
的标签列表来为不同的客户附加配置,以实现不同客户的配置。
设置基本配置
工作时间解析度
使用-R
可以设置工作时间解析度。默认值为0.25
,表示半小时。因此,如果您添加一个持续时间为16分钟的工作,这将四舍五入到30分钟。
例如,您可能将基本解析度更改为半小时,如下所示
▶ jobber -R 0.5
Beginning new database file 'jobber.json'
Changed the following default configuration values:
Resolution: 0.5 hours
Saved database into file 'jobber.json'
每小时工资率
要更改您的时薪,请使用-P
。默认值没有设置,因此如果您不设置它,则不会显示任何费率。如果您这样做,jobber在列出时会列出成本。
▶ jobber -P 100
Loaded database (0 entries) from file 'jobber.json'
Changed the following default configuration values:
Payment per hour: 100
Saved database into file 'jobber.json'
每天最大小时数
如果您使用-H
设置此值,并且工作天数超过此值,则报告中的这些天数将被标记为黄色。在列出超出此值的工作时,这些工作将被标记为黄色。
因此,如果您想将每天的最大工作时间更改为8小时,请使用以下方法
▶ jobber -H 8
Loaded database (0 entries) from file 'jobber.json'
Changed the following default configuration values:
Maximum work time: 8 hours
Saved database into file 'jobber.json'
为特定标记设置配置
如果您有多个客户,并且每个客户有不同的支付率,您可以在设置配置时添加标签选项-t
。
显示配置
要显示您的配置(s),请使用选项-C
▶ jobber -C
Loaded database (3 entries) from file 'jobber.json'
Base Configuration:
Resolution: 0.5 hours
Payment per hour: 100
Maximum work time: 8 hours
Database unchanged.
依赖项
~6–18MB
~192K SLoC