2016-03-15 77 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是某一天的年數。

聲明:我是該工具的作者。