我经常发现自己需要从一种时间类型转换到另一种时间类型,并且还没有找到一种我一直满意的方式。每次我做一个快速的谷歌搜索,我都会想出不同的(有时非常复杂)的答案。
我很高兴
date -d "Sep 5 1986" "+%s"
用于将标准日期转换为纪元时间,但我似乎无法进行反向工作(而且我浏览过的手册页并没有太大帮助。)
date -d "526276800" "+%m/%d/%y"
在我的 RHEL 5 安装中产生错误。
社区可以为我提供一些轻松来回转换的策略吗?我将采用所有形式:awk、perl、日期。每种方法的优缺点是什么?
日期 -d @526276800 "+%m/%d/%y"
在我的 Mac OS X 机器上,我使用:
使用 GNU 日期:
日期 -d '1970-01-01 946684800 秒'
或者在 Ruby 中:
以下是
strftime
从 rubyTime
类文档中获取的格式:这可能有点繁重,但在 perl 中有一个名为 DateTime 的很棒的模块,它可以在无数的日期和时间格式之间来回转换,包括纪元。使用非常简单:
http://datetime.perl.org/
就个人而言,我为此选择使用 Python 和 bash。但是,既然您对此感到恼火;-) 我会制作一个小脚本,该脚本将日期作为参数并将其编写为具有--2epoch 和--2normal 选项。
这样,您可以使用
反之亦然
输入日期的格式是否总是相同的?这将使脚本更容易编写。
Perl 单行:
$ perl -MDate::Manip -le 'print UnixDate(ParseDateString("epoch".shift()),"%c")' 946684800
从时代:
将纪元时间戳从标准输入(第一个示例)或作为 args(第二个示例)转储为可读形式,不要忘记 strftime 的强大功能!
perl -pe '$_=~s/(\d{10})/scalar localtime($1)/eg'
perl -e '$s=join(" ",@ARGV);$s=~s/(\d{10})/scalar localtime($1)/eg;print"$s\n"'
perl -pe 'use POSIX qw(strftime);s/(\d{10,10})/strftime("%Y%m%d-%H:%M:%S",$1)/eg'
时代:
如果你为 perl 安装了 Date::Manip 模块(默认情况下通常是 ISNT),你可以使用:
perl -MDate::Manip -e '$stamp=UnixDate(ParseDate(join(" ",@ARGV)),"%s");printf"%d %s\n",$stamp,scalar localtime($stamp)' sep 9 2006
有时很难决定是否要替换“过滤器”中的时间戳,或者是否要使用找到的时间戳作为行的开头。我在那个上来回翻转。