如何在 Bash 中将时间戳转换为日期?
我需要一个 shell 命令或脚本将 Unix 时间戳转换为日期。输入可以来自第一个参数或来自标准输入,允许以下使用模式:
ts2date 1267619929
并且
echo 1267619929 | ts2date
两个命令都应输出“Wed Mar 3 13:38:49 2010”。
I need a shell command or script that converts a Unix timestamp to a date. The input can come either from the first parameter or from stdin, allowing for the following usage patterns:
ts2date 1267619929
and
echo 1267619929 | ts2date
Both commands should output "Wed Mar 3 13:38:49 2010".
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(18)
在具有 GNU Coreutils > 的系统上= 5.3.0,例如Linux,您可以使用:
On systems with GNU Coreutils >= 5.3.0, e.g. Linux you can use:
我在 Mac OS X 上工作。
works for me on Mac OS X.
此版本类似于 chiborg 答案,但它消除了对外部
tty< 的需要/code> 和
cat
。它使用date
,但也可以轻松使用gawk
。您可以更改 shebang 并将双方括号替换为单方括号,这也将在sh
中运行。This version is similar to chiborg's answer, but it eliminates the need for the external
tty
andcat
. It usesdate
, but could just as easily usegawk
. You can change the shebang and replace the double square brackets with single ones and this will also run insh
.例如,您可以使用 GNU 日期,
或者
You can use GNU date, for example,
or
您可以像这样从时间戳获取格式化日期
You can get formatted date from timestamp like this
我使用这个跨平台的单行:
它应该可以在 macOS 和流行 Linux 发行版的现代版本中工作。
I use this cross-platform one-liner:
It should work both in macOS and modern versions of popular Linux distributions.
从 Bash 4.2 开始,您可以使用
printf
的%(datefmt)T
格式:这很好,因为它是 shell 内置的。 datefmt 的格式是
strftime(3)
接受的字符串(请参阅man 3 strftime
)。这里%c
是:现在,如果您想要一个接受参数的脚本,并且如果没有提供参数,则读取 stdin,您可以继续执行以下操作:
Since Bash 4.2 you can use
printf
's%(datefmt)T
format:That's nice, because it's a shell builtin. The format for datefmt is a string accepted by
strftime(3)
(seeman 3 strftime
). Here%c
is:Now if you want a script that accepts an argument and, if none is provided, reads stdin, you can proceed as:
您可以使用这个简单的 awk 脚本:
示例用法:
You can use this simple awk script:
Sample usage:
我在转换日志文件或监视它们时使用它:
I use this when converting log files or monitoring them:
在 OSX 或 BSD 中,有一个等效的
-r
标志,它显然采用 unix 时间戳。下面是一个运行 date 四次的示例:一次用于第一次日期,以显示它是什么;一次用于第一次日期,以显示它是什么;一次用于第一次日期,以显示它是什么。一种用于使用%s
转换为 unix 时间戳,最后一种使用-r
将%s
提供的内容转换回细绳。至少,似乎可以在我的机器上工作。
In OSX, or BSD, there's an equivalent
-r
flag which apparently takes a unix timestamp. Here's an example that runs date four times: once for the first date, to show what it is; one for the conversion to unix timestamp with%s
, and finally, one which, with-r
, converts what%s
provides back to a string.At least, seems to work on my machine.
我自己编写了一个脚本来执行此操作:
I have written a script that does this myself:
在这个答案中,我复制了 Dennis Williamson 的答案并对其进行了稍微修改,以便在将一列包含许多时间戳的管道传输到脚本时允许大幅提高速度。例如,在我的机器上使用 xargs -n1 将 1000 个时间戳传输到原始脚本需要 6.929 秒,而使用此修改版本则需要 0.027 秒:
In this answer I copy Dennis Williamson's answer and modify it slightly to allow a vast speed increase when piping a column of many timestamps to the script. For example, piping 1000 timestamps to the original script with xargs -n1 on my machine took 6.929s as opposed to 0.027s with this modified version:
一些例子:
some example:
我喜欢以前针对特殊情况的解决方案:
printf '%(%c)T\n' $timestamp
(如果您有 Bash>=4.2)、date -d @$timestamp
code> (如果您有 GNU Coreutils >= 5.3.0),date -r $timestamp
(如果您使用的是 BSD/MacOS),但我需要一些更便携的东西,所以我选择了jq
我到处都可以帮助处理 JSON:可以在函数中使用它来获得所需的效果:
I like the previous solutions for special cases:
printf '%(%c)T\n' $timestamp
(if you have Bash>=4.2),date -d @$timestamp
(if you have GNU Coreutils >= 5.3.0),date -r $timestamp
(if you are on BSD/MacOS), but I needed something more portable and I opted forjq
that I have everywhere to help with JSON:Which could be used in a function to obtain the desired effect:
将字符串中长度为 13 的时间戳转换为本地时区中的等效日期
虽然不是纯 bash,但以下脚本将使用 perl timestamp_to_date.sh
输入
输出
While not pure bash, the following script will convert timestamps of length 13 in a string to their equivalent date in your local timezone using perl
timestamp_to_date.sh
input
output
我必须在 bash 历史记录中内联转换时间戳才能对我有意义。
也许以下内容来自对 如何用 sed、awk 等 shell 命令的输出替换子字符串? 其他读者也可能会感兴趣。
感谢 @Gabriel 的原始 sed 内联代码。
I had to convert timestamps inline in my bash history to make sense to me.
Maybe the following coming from an answer to How do I replace a substring by the output of a shell command with sed, awk or such? could be interesting to other readers too.
Kudos for the original sed inline code go to @Gabriel.
如果您希望一次格式化多个时间戳,我编写了一个名为 datefmt 的 C 实用程序,用于格式化文本流中的时间戳:
假设我们有一些包含 unix 时间戳的日志:
我们可以将此日志通过管道传输到 datefmt 中,以将这些时间戳转换为人类可读的日期:
当然,您也可以自定义格式:
我已将其打包在NixOS,希望它很快就会推广到其他发行版,但现在您需要下载 tarball 并使用
make
构建它If you're looking to format many timestamps all at once, I've written a C util called datefmt that formats timestamps in a text stream:
Let’s say we have some logs that contain unix timestamps:
We can pipe this log into datefmt to convert these timestamps into human-readable dates:
Of course you can customize the format as well:
I've packaged this in NixOS, hopefully it will trickle out to other distros soon, but for now you will need to download the tarball and build it with
make
在 PHP 中
In PHP