The UNIX and Linux Forums  

Go Back   The UNIX and Linux Forums > Top Forums > UNIX for Dummies Questions & Answers
Google UNIX.COM


UNIX for Dummies Questions & Answers If you're not sure where to post a UNIX or Linux question, post it here. All UNIX and Linux newbies welcome !!

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Days difference between two dates Data469 Shell Programming and Scripting 6 03-26-2008 11:32 AM
Number of days between two distinct dates radheymohan UNIX for Advanced & Expert Users 1 10-16-2007 05:39 AM
Find number of days and list out the dates in between Raynon Shell Programming and Scripting 2 02-12-2007 04:52 PM
ls latest 4 days or specify days of files in the directory happyv Shell Programming and Scripting 3 01-22-2007 03:16 AM
Difference between two dates in no of days ??? csaha Shell Programming and Scripting 1 01-13-2006 02:44 AM

Closed Thread
 
Submit Tools LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 03-01-2002
Registered User
 

Join Date: Jan 2002
Posts: 10
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Reddit! Stumble this Post!Spurl this Post!
days elapsed between 2 dates

does anybody know how to find out the number of
days elapsed between 2 dates

e.g.

days elapsed between 020212 and 020110 (YYMMDD format)

Thanking you in advance.

Ravi.
Forum Sponsor
  #2 (permalink)  
Old 03-04-2002
Perderabo's Avatar
Unix Daemon
 

Join Date: Aug 2001
Location: Washington DC Area
Posts: 8,253
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Reddit! Stumble this Post!Spurl this Post!
We really don't (yet) have a posting that addresses the general problem of number of days between two dates. So I have just finished what should be the last date calculation script that I ever write. The math gave me fits and I'm not sure that I have this right yet. But here it is anyway. Some examples of what it can do...
> datecalc -a 1960 12 31 - 1922 2 2
14212
> datecalc -a 1960 12 31 + 7
1961 1 7
> datecalc -D 1960 12 31
Saturday

I have just revised this script. I added a -l option to calculate the last day of the month. I added a function to do this and modified the date2jd function to use this new function. I improved the error messages and added a -help option to hopefully make datecalc self-documenting.

As before, if you find any bugs please let me know. Ans if find any date manipulation need that it can't do please let me know that as well. I am still hopeful that this script can solve all date manipulation problems.

Here is the new version...
Code:
#! /usr/bin/ksh

#  datecalc -- Perderabo's date calculator   
#

USAGE="\
datecalc -a year month day - year month day
datecalc -a year month day [-|+] n
datecalc -d year month day
datecalc -D year month day
datecalc -j year month day
datecalc -j n
datecalc -l year month
use \"datecalc -help\" use for more documentation"

DOCUMENTATION="\
  datecalc  Version 1.1

  datecalc does many manipulations with dates.
  datecalc -a is for date arithmetic
  datecalc -d or -D converts a date to the day of week
  datecalc -j converts to date to or from julian day
  datecalc -l outputs the last day of a month

  All dates must be between the years 1860 and 3999.

  datecalc -a followed by 7 parameters will calculate the
  number of days between two dates.  Parameters 2-4 and 6-8
  must be dates in ymd form, and parameter 5 must be a minus
  sign.  The output is an integer.  Example:

  > datecalc -a 1960 12 31 - 1922 2 2
  14212


  datecalc -a followed by 5 parameters will calculate the
  a new date offset from a given date,  Parameters 2-4 must
  be a date in ymd form, paramter 5 must be + or -, and 
  paramter 6 must be an integer.  Output is a new date.
  Example:

  > datecalc -a 1960 12 31 + 7
  1961 1 7


  datecalc -d followed by 3 parameters will convert a date
  to a day-of-week.  Parameters 2-4 must be a date in ymd 
  form.  Example:

  > datecalc -d 1960 12 31
  6


  datecalc -D is like -d except it displays the name of
  the day.  Example:

  > datecalc -D 1960 12 31
  Saturday


  datecalc -j followed by 3 parameters will convert a date
  to Modified Julian Day number.  Example:
  > datecalc -j 1960 12 31
  37299


  datecalc -j followed by a single parameter will convert
  a Modified Julian Day number to a date.  Example:
  > datecalc -j 37299
  1960 12 31


  datecalc -l followed by year and month will output the last
  day of that month.  Note that by checking the last day of
  February you can test for leap year.  Example:
  > datecalc -l 2002 2
  28"


lastday()  {
        integer year month leap
#                         ja fe ma ap ma jn jl ag se oc no de
        set -A mlength xx 31 28 31 30 31 30 31 31 30 31 30 31

        year=$1
        if ((year<1860 || year> 3999)) ; then
                print -u2 year out of range
                return 1
        fi
        month=$2
        if ((month<1 || month> 12)) ; then
                print -u2 month out of range
                return 1
        fi

        if ((month != 2)) ; then
                print ${mlength[month]}
                return 0
        fi

        leap=0
        if ((!(year%100))); then
                ((!(year%400))) && leap=1
        else
                ((!(year%4))) && leap=1
        fi

        feblength=28
        ((leap)) && feblength=29
        print $feblength
        return 0
}


date2jd() {
        integer ijd day month year mnjd jd lday

        year=$1
        month=$2
        day=$3
        lday=$(lastday $year $month) || exit $?

        if ((day<1 || day> lday)) ; then
                print -u2 day out of range
                return 1
        fi

        ((standard_jd = day - 32075 
           + 1461 * (year + 4800 - (14 - month)/12)/4 
           + 367 * (month - 2 + (14 - month)/12*12)/12 
           - 3 * ((year + 4900 - (14 - month)/12)/100)/4))
        ((jd = standard_jd-2400001))


        print $jd
        return 0
}


jd2dow()
{
        integer jd dow numeric_mode
        set +A days Sunday Monday Tuesday Wednesday Thursday Friday Saturday

        numeric_mode=0
        if [[ $1 = -n ]] ; then
                numeric_mode=1
                shift
        fi


        jd=$1
        if ((jd<1 || jd>782028)) ; then
                print -u2 julian day out of range
                return 1
        fi

        ((dow=(jd+3)%7))

        if ((numeric_mode)) ; then
                print $dow
        else
                print ${days[dow]}
        fi
        return
}

jd2date()
{
        integer standard_jd temp1 temp2 jd year month day

        jd=$1
        if ((jd<1 || jd>782028)) ; then
                print julian day out of range
                return 1
        fi
        ((standard_jd=jd+2400001))
        ((temp1 = standard_jd + 68569))
        ((temp2 = 4*temp1/146097))
        ((temp1 = temp1 - (146097 * temp2 + 3) / 4))
        ((year  = 4000 * (temp1 + 1) / 1461001))
        ((temp1 = temp1 - 1461 * year/4 + 31))
        ((month = 80 * temp1 / 2447))
        ((day   = temp1 - 2447 * month / 80))
        ((temp1 = month / 11))
        ((month = month + 2 - 12 * temp1))
        ((year  = 100 * (temp2 - 49) + year + temp1))
        print $year $month $day
        return 0
}


#
#  Parse parameters and get to work.
case $1 in
-a)     if (($# == 8)) ; then
                if [[ $5 != - ]] ; then
                        print -u2 - "$USAGE"
                        exit 1
                fi
                jd1=$(date2jd $2 $3 $4) || exit $?
                jd2=$(date2jd $6 $7 $8) || exit $?
                ((jd3=jd1-jd2))
                print $jd3
                exit 0
        elif (($# == 6)) ; then
                jd1=$(date2jd $2 $3 $4) || exit $?
                case $5 in 
                -|+) eval '(('jd2=${jd1}${5}${6}'))'
                        jd2date $jd2
                        exit $?
                        ;;
                *)
                        print -u2 - "$USAGE"
                        exit 1
                        ;;
                esac
                        
        fi
        ;;

-d|-D)  if (($# != 4)) ; then
                print -u2 - "$USAGE"
                exit 1
        fi
        jd1=$(date2jd $2 $3 $4) || exit $?
        numeric=-n
        [[ $1 = -D ]] && numeric=""
        eval jd2dow $numeric $jd1 
        exit $?
        ;;

-j)     if (($# == 4)) ; then
                date2jd $2 $3 $4
                exit $?
        elif (($# == 2)) ; then
                jd2date $2 $3 $4
                exit $?
        else
                print -u2 - "$USAGE"
                exit 1
        fi
        ;;

-l)      if (($# == 3)) ; then
                lastday $2 $3
                exit $?
        else
                print -u2 - "$USAGE"
                exit 1
        fi
        ;;

-help)  print - "$USAGE"
        print  ""
        print - "$DOCUMENTATION"
        exit 0
        ;;

*)      print -u2 - "$USAGE"
        exit 0
        ;;


esac

#not reached
exit 7

Last edited by Perderabo; 03-11-2002 at 09:25 AM.
Google UNIX.COM
Closed Thread

Thread Tools
Display Modes


The 50 most popular UNIX and Linux searches.
Google Search Cloud for The UNIX and Linux Forums
421 service not available, remote server has closed connection ^m automate ftp autosys awk trim bash eval bash exec bash for loop command copy/move folder in unix couldn't set locale correctly curses.h cut command in unix export command in unix find grep find mtime find null character in a unix file grep multiple lines grep or grep recursive hp-ux ifconfig inaddr_any inappropriate ioctl for device lynx javascript mailx attachment mget mtime ping port remove first character from string in k shell replace space by comma , perl script rsync ftp scp recursive segmentation fault(coredump) sftp script snoop unix solaris change ip address stale nfs file handle syn_sent tar exclude tar extract to folder test: argument expected unix unix .profile unix forum unix forums unix internals unix mtime unix simulator unix.com vi substitute while loop within while loop shell script


All times are GMT -7. The time now is 03:42 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited.
The UNIX and Linux Forums Content Copyright ©1993-2008 The CEP Blog All Rights Reserved -Ad Management by RedTyger Visit The Global Fact Book

Content Relevant URLs by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101