2016-03-15 78 views
0

我在我的UNX脚本中传递一个Julian日期值作为参数。根据日期值将其转换为正常日期。然而,限制是目前我只能将其转换为当前或上一个日期。以下是我的代码将字符串值转换为AIX中的常规日期UNIX

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),并将其转换为常规日期,而不只是当天的日期或以前日期

+0

鉴于您的“朱利安”日期为16074年,公历日期应该是“YYYY-mm-dd”? http://aa.usno.navy.mil/cgi-bin/aa_jdconv.pl?form=2&jd=16074建议公历日期为公元前4669年 –

+0

公历16074的公历日期为2016年3月14日。基本上2016年是16个,074是今年的第74个。 –

+0

这绝对不是[Julian日期](https://en.wikipedia.org/wiki/Julian_day)。 –

回答

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 
+0

我怀疑你需要'#!/ bin/bash'而不是'#!/ bin/sh' –

+1

我建议避免使用bash特有的功能,特别是在AIX上 –

+0

让我试试这个代码.. –

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版本中引入了它。

1

Dateutils能做到这一点:

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

其中%D是某一天的年数。

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