【问题标题】:Date Argument format conversion from YYYYMMDD to DD-MON-YYYY从 YYYYMMDD 到 DD-MON-YYYY 的日期参数格式转换
【发布时间】:2019-06-27 14:02:31
【问题描述】:

谁能告诉我如何将日期参数值 YYYYMMDD(即,例如,例如 20171010)转换为日期格式“DD-MON-YYYY”(即 2017 年 10 月 10 日)。 我还需要在执行脚本时验证用户指定为参数的日期。

注意:文件系统将只支持 AIX 命令。我有如下建议,AIX 文件系统不支持。

参考页面 - https://www.unix.com/shell-programming-and-scripting/173248-converting-date-yyyymmdd-dd-mon-yyyy.html

https://www.unix.com/shell-programming-and-scripting/58675-change-date-dd-mmm-yyyy-mm-dd-yyyy.html

日期 -f 日期-j 日期 -d

【问题讨论】:

  • 你想要什么日期验证?
  • 我需要将日期参数值从 YYYYMMDD 转换为 'DD-MON-YYYY' 。我还需要验证用户是否以“YYYYMMDD”格式正确给出了参数值。
  • 如果没有额外的验证规则,您无法判断用户输入的是 YYYYMMDD 还是 DDMMYYYY 还是 MMDDYYYY(或其他内容)。
  • 您能先告诉我如何将日期参数值格式从 YYYYMMDD 转换为 DD-MON-YYYY 吗?然后我们将进行验证部分
  • 嗯,你用的是哪种编程语言?

标签: unix aix


【解决方案1】:
St_dt="$2"
St_D="${St_dt#??????}"
tmp="${St_dt%??}"
St_M="${tmp#????}"
if [ $St_M -le 0 -o $St_M -gt 12 ];
then
echo "$St_M is invalid month."
exit 1
fi
St_Y="${tmp%??}"
case "$St_M" in
01) St_M=JAN ;;
02) St_M=FEB ;;
03) St_M=MAR ;;
04) St_M=APR ;;
05) St_M=MAY ;;
06) St_M=JUN ;;
07) St_M=JUL ;;
08) St_M=AUG ;;
09) St_M=SEP ;;
10) St_M=OCT ;;
11) St_M=NOV ;;
12) St_M=DEC ;;
esac
Start_dt="${St_D}-${St_M}-${St_Y}"
echo "$Start_dt"

【讨论】:

    【解决方案2】:

    ksh93 sn-p 作为开始;它做了两个简单的检查,然后根据需要重新排列输入的日期:

    echo enter date
    read d
    if [ "${#d}" -ne 8 ]
    then
      echo "bogus - not the right length"
    else
      case $d in
        (*[^0123456789]*) echo "bogus - contains non-numerics"
            ;;
        (*) echo "the new date is: ${d:6:2}-${d:4:2}-${d:0:4}"
            ;;
      esac
    fi
    

    【讨论】:

    【解决方案3】:

    如果你有 Perl,这样的脚本应该可以工作:

    #!/path/to/my/perl
    
    use POSIX;
    for (@ARGV ? @ARGV : <STDIN>) {
        my ($Y,$m,$d) = m/(\d\d\d\d)(\d\d)(\d\d)/;
        my $t = strftime "%d-%b-%Y", 0,0,0,$d,$m,$Y-1900;
        print "\U$t\n";
    }
    

    我不知道 AIX sh 提供了哪些功能,但这可能会起作用:

    #!/usr/bin/sh
    
    case "$1" in
        [1-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9])
            Y=${date%????}
            MD=${date#????}
            D=${MD#??}
            M=${MD%??}
            case "$M" in
                01) M=JAN ;;
                02) M=FEB ;;
                03) M=MAR ;;
                04) M=APR ;;
                05) M=MAY ;;
                06) M=JUN ;;
                07) M=JUL ;;
                08) M=AUG ;;
                09) M=SEP ;;
                10) M=OCT ;;
                11) M=NOV ;;
                12) M=DEC ;;
            esac
            echo "${D}-${M}-${Y}"
            ;;
        *)
            echo 1>&2 "invalid date"
            exit 1 ;;
    esac
    

    【讨论】:

    • 出现错误 - 第 6 行出现语法错误:不应出现 `('。
    • 这很奇怪。尝试修改版本。
    • 你能告诉我如何在 Unix shell 脚本中实现同样的功能
    • 您如何定义“Unix shell 脚本”?通常,shell 仅用于将命令(日期、sed、awk、wc、排序等)粘合在一起。 Perl 只是这些命令之一。我添加了 Bourne shell 版本,但我不知道 AIX 版本支持哪些功能。
    • 尝试了你给出的上述逻辑..只得到双'-'作为输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多