在AIX UNIX中将字符串值转换为常规日期

时间:2016-03-15 14:38:09

标签: unix unix-timestamp aix

我在我的UNX脚本中传递Julian日期值作为参数。根据日期值,它将转换为常规日期。但是,约束是目前我只能将其转换为当前或以前的日期。以下是我的代码

    PARAM_NAME=$1
PARAM_VALUE=$2 //where Julian date is passed

if [[  $PARAM_NAME == 'LOANS_BATCH_CONTROL_PS.ISLFILE_PROCESSING_DATE' && $PARAM_VALUE == `TZ=aaa24 date +%y%j` ]]; then
date_replace_string=`TZ=aaa24 date +%m%d%Y`
PARAM_VALUE=$date_replace_string

我想知道是否有任何地方我可以将此paramter_value与任何日期值(julian日期:例如16074)并将其转换为常规日期而不仅仅是当前日期或前一天日期

3 个答案:

答案 0 :(得分:1)

Dateutils可以做到这一点:

$ dateconv -i '%y%D' 16074 -f '%Y-%m-%d'
2016-03-14

其中%D是日期计数。

免责声明:我是该工具的作者。

答案 1 :(得分:0)

你可以用GNU-date,sg做数学运算。像这样:

#!/bin/sh

DATE=gdate

jul7_to_std () {
    local Y=${1%???}
    local j=${1#????}
    local j_1=$(expr $j - 1)
    local jan1=${Y}0101
    $DATE '+%Y%m%d' -d "$jan1 +$j_1 days"
}

jul5_to_std () {
    jul7_to_std 20$1
}

jul7_plus () {
    local dstd="$(jul7_to_std $1)"
    local dtmp="$dstd"
    if [ $2 -gt 0 ]; then
        dtmp=$($DATE '+%Y%m%d' -d "$dstd +$2 days")
    elif [ $2 -lt 0 ]; then
        dtmp=$($DATE '+%Y%m%d' -d "$dstd $2 days")
    fi
    $DATE '+%Y%j' -d "$dtmp"
}

jul5_plus () {
    local tmp="$(jul7_plus "20$1" "$2")"
    echo "${tmp#??}"
}

jul5_plus 16001  365
jul5_plus 15123    1
jul5_plus 16100 -200

答案 2 :(得分:0)

我不太了解AIX。如果您的Perl发行版是相对最新的,您可以这样做:

perl -MTime::Piece -sle '
    $t = Time::Piece->strptime($date,"%y%j"); 
    print $t->strftime("%Y-%m-%d")
' -- -date="16074"
2016-03-14

Time::Piece是一个核心Perl模块,但我不记得哪个perl版本引入了它。