我有一个存储在Unix KornShell(ksh)脚本变量中的日期值:
VALUE="2010_09_23"
我想将其更改为“2010年9月23日”并将其存储在VALUE1中。我该怎么办?
VALUE1="23-Sep-2010"
答案 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