假设我有millisecond=169920
等于 00:02:49.92 (h:m:s:ms) 的数值。此输入来自一个文本文件,一个在另一个之下。
我如何在 Bash 中将这些毫秒转换为时间?
大多数问题询问日期的毫秒数或使用与此不相关的纪元时间:我只需要时间,而不是日期。
包含毫秒的文本文件示例:
cat milisecond.txt
169920
269320
163920
1339520
假设我有millisecond=169920
等于 00:02:49.92 (h:m:s:ms) 的数值。此输入来自一个文本文件,一个在另一个之下。
我如何在 Bash 中将这些毫秒转换为时间?
大多数问题询问日期的毫秒数或使用与此不相关的纪元时间:我只需要时间,而不是日期。
包含毫秒的文本文件示例:
cat milisecond.txt
169920
269320
163920
1339520
如何使用与(模运算)将毫秒转换为小时、分钟、秒和
bash
毫秒%
?输出:
下面是将毫秒转换为时间的 bash 函数:
这可能是您要使用任何 awk 尝试执行的操作:
这将更易于增强和维护,更易于移植,并且比逐行读取每个输入行并使用 bash 内置函数进行转换(我怀疑您可能打算这样做)快几个数量级。请参阅为什么使用 shell 循环处理文本被认为是不好的做法。
0. 序言
此答案基于
和之间有
time
限制!!00:00:00
23:59:59
如果您想要更详尽的答案,显示大于
86,400,000
毫秒的值,您可以跳过我的答案的前三个部分并直接转到第4 部分。小时数不限于“23(:59:59)”。1.
sed
可以快速将毫秒转换为秒:2.
printf
可以快速将秒转换为时间:printf
在命令前面加上忽略您所在地区的时区偏移的命令TZ=UTC
。2.1. 或者,使用带有数组
mapfile
并避免循环:3.
printf
可以定义一个变量:3.1. 构建无循环的时间数组
4. 不受时间限制
"23(:59:59)"
4.1. 与日计数相同
4.2. 进入函数定义数组变量
5. 无循环也一样
5.1. 进入函数定义数组变量
然后
5.2. 与日计数相同
5.3. Same,没有任何分支或循环
6. 小卧推环与无环。
在我的系统上对一个 32'805 行文件进行小测试:
通过使用循环,第 4.2 节中的函数需要 ~2.7 秒,但是通过不使用任何循环,第 5.3 节中的函数只需要 ~1 秒。
(幸运的是两个数组是相同的!;)
您可以使用
date
它:诀窍是,使用纪元之后的时间(1.1.1970 0:00:00)。UTC
-u
输出选项很重要。该格式%T
仅打印时间。警告:其效果仅持续不到 24 小时。