关于UNIX变量日期格式

时间:2010-09-23 00:02:14

标签: shell unix sed awk ksh

我有一个存储在Unix KornShell(ksh)脚本变量中的日期值:

VALUE="2010_09_23"

我想将其更改为“2010年9月23日”并将其存储在VALUE1中。我该怎么办?

VALUE1="23-Sep-2010"

5 个答案:

答案 0 :(得分:3)

Ksh通过内置的printf内置了日期格式化功能。文档不清楚如何格式化参数;以下适用于我的ksh 93s +:

VALUE1=$(printf "%(%02d-%b-%Y)T\n" "${VALUE//_/-}")

答案 1 :(得分:2)

使用便携式awk和月份名称的硬编码列表。 substr调用解决一个棘手的问题是在某些awk实现中对数字'08'和'09'的解释:它们是十进制数'8'和'9'还是无效的八进制数?

echo "$VALUE" | awk -F'_' '
    BEGIN {
        OFS="-"
        split("Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec", m)
    }
    {
        $2 = 10 * substr($2, 1, 1) + substr($2, 2, 1)
        print $3, m[$2], $1
    }'

答案 2 :(得分:0)

此命令在OSX上执行您想要的操作:

VALUE1=$(date -j -f %Y_%m_%d +%d-%b-%Y "$VALUE")

如果您使用的是其他Unix变体,则所需的date选项组合可能会有所不同。 % - 符号标准化很好(参见man strftime),但date命令的功能不是。

GNU coreutils date(你在Linux上获得的,也可能隐藏在你的“SunOS”系统的某个地方(我怀疑你实际上意味着“SunOS”,Sun Microsystems还没有称它的Unix变体已经存在了大约十五年,但即便如此,/usr/bin中的东西仍然是令人难以置信的过时垃圾) - 查看/usr/local以及/opt的所有子目录 - 也可以这样做,但你必须预处理输入:

VALUE1=$(date -d $(echo $VALUE | tr _ -) +%d-%b-%Y)

可能也可以使用,具体取决于您拥有的shell:

VALUE1=$(date -d ${VALUE//_/-} +%d-%b-%Y)

答案 3 :(得分:0)

VALUE="2010_09_23"
VALUE1="$( gawk -v date="$VALUE" 'BEGIN {
    gsub(/_/, " ", date)
    print strftime("%d-%b-%Y", mktime(date " 00 00 00"))
}')"

答案 4 :(得分:0)

使用Perl:

echo 2010_09_23 |  perl '-MPOSIX qw(strftime)'  -le'
    @dt = split /_/,<STDIN>;
    print strftime( "%d-%b-%Y",0,0,0,$dt[2],$dt[1]-1,$dt[0]-1900);
  '

输出:

23-Sep-2010