| 1 | #From: [email protected] (Mario Boudreault)
|
|---|
| 2 | #Newsgroups: comp.unix.shell
|
|---|
| 3 | #Subject: JULIAN DATE CONVERSION SUB
|
|---|
| 4 | #Date: 4 Aug 1995 10:23:28 -0400
|
|---|
| 5 | #Message-ID: <[email protected]>
|
|---|
| 6 |
|
|---|
| 7 | #For those using shells and who want to convert dates to a julian number
|
|---|
| 8 | #here is a shell script (wihtout validation) that can be used as a base
|
|---|
| 9 | #program for your shell scripts.
|
|---|
| 10 |
|
|---|
| 11 | #Special thanks to Ed [email protected] who sent me the algorithm to compute
|
|---|
| 12 | #that date.
|
|---|
| 13 |
|
|---|
| 14 | #
|
|---|
| 15 | # MODIFIED BY CHET RAMEY TO CONVERT TO bash v2 SYNTAX
|
|---|
| 16 | #
|
|---|
| 17 |
|
|---|
| 18 | # cnvdate - Conversion de dates en julienne et vice et versa...
|
|---|
| 19 | #
|
|---|
| 20 | # Par : Mario Boudreault Damatex Inc Montreal, Canada
|
|---|
| 21 | # Date: 2 Aout 1995
|
|---|
| 22 | # Rev.: 2 Aout 1995
|
|---|
| 23 | #
|
|---|
| 24 | # Usage:
|
|---|
| 25 | # cvdate [-j] YYYMMDD pour convertir en nbre de jours
|
|---|
| 26 | # cvdate -d {julian number} pour convertir en AAAAMMJJ
|
|---|
| 27 | #
|
|---|
| 28 |
|
|---|
| 29 | jul_date()
|
|---|
| 30 | {
|
|---|
| 31 | #
|
|---|
| 32 | # Separe ANNEE, MOIS et JOUR...
|
|---|
| 33 | #
|
|---|
| 34 | YEAR=`echo $DATE | awk ' { print substr($0,1,4) } '`
|
|---|
| 35 | MONTH=`echo $DATE | awk ' { print substr($0,5,2) } '`
|
|---|
| 36 | DAY=`echo $DATE | awk ' { print substr($0,7,2) } '`
|
|---|
| 37 | #
|
|---|
| 38 | # Execute la formule magique...
|
|---|
| 39 | #
|
|---|
| 40 | A=$(( $DAY - 32075 + 1461 * ( $YEAR + 4800 - ( 14 - $MONTH ) / 12 ) \
|
|---|
| 41 | / 4 + 367 * ( $MONTH - 2 + ( 14 - $MONTH ) / 12 * 12 ) / 12 - \
|
|---|
| 42 | 3 * ( ( $YEAR + 4900 - ( 14 - $MONTH ) / 12 ) / 100 ) / 4 ))
|
|---|
| 43 | echo $A
|
|---|
| 44 | }
|
|---|
| 45 |
|
|---|
| 46 | day_date()
|
|---|
| 47 | {
|
|---|
| 48 | TEMP1=$(( $DATE + 68569 ))
|
|---|
| 49 | TEMP2=$(( 4 * $TEMP1 / 146097 ))
|
|---|
| 50 | TEMP1=$(( $TEMP1 - ( 146097 * $TEMP2 + 3 ) / 4 ))
|
|---|
| 51 | Y=$(( 4000 * ( $TEMP1 + 1 ) / 1461001 ))
|
|---|
| 52 | TEMP1=$(( $TEMP1 - 1461 * $Y / 4 + 31 ))
|
|---|
| 53 | M=$(( 80 * $TEMP1 / 2447 ))
|
|---|
| 54 | D=$(( $TEMP1 - 2447 * $M / 80 ))
|
|---|
| 55 | TEMP1=$(( $M / 11 ))
|
|---|
| 56 | M=$(( $M + 2 - 12 * $TEMP1 ))
|
|---|
| 57 | Y=$(( 100 * ( $TEMP2 - 49 ) + $Y + $TEMP1 ))
|
|---|
| 58 | M=`echo $M | awk ' { M=$0 ; if ( length($0) == 1 ) M="0"$0 } END { print M } '`
|
|---|
| 59 | D=`echo $D | awk ' { D=$0 ; if ( length($0) == 1 ) D="0"$0 } END { print D } '`
|
|---|
| 60 | echo $Y$M$D
|
|---|
| 61 | }
|
|---|
| 62 |
|
|---|
| 63 | # main()
|
|---|
| 64 |
|
|---|
| 65 | if [ $# -eq 1 ]; then
|
|---|
| 66 | DATE=$1
|
|---|
| 67 | jul_date
|
|---|
| 68 | elif [ "$1" = '-j' ]; then
|
|---|
| 69 | DATE=$2
|
|---|
| 70 | jul_date
|
|---|
| 71 | elif [ "$1" = '-d' ]; then
|
|---|
| 72 | DATE=$2
|
|---|
| 73 | day_date
|
|---|
| 74 | fi
|
|---|
| 75 | #
|
|---|
| 76 | # Termine
|
|---|
| 77 | #
|
|---|
| 78 | exit 0
|
|---|