Day/Hour diff between two date

Dear All

I need to find out day diff between two dates. date -d or date -- day is not working in mine system.

Currently i am using below code but it gives me wrong value while month change.

IP:

Date 1: 20150802 11:30:45
Date 2: 20150728 16:30:45

code used:

awk '{t1=$2; t2=$4; split(t1,a,":");split(t2,b,":"); if(($1-$3)){print $0,int(((substr(($1-$3+1),2,1)*24*3600+0*60+0)-(b[1]*3600+b[2]*60+b[3]))/3600+((0*3600+0*60+0)+(a[1]*3600+a[2]*60+a[3]))/3600)} else {print $0,int($1-$3+((a[1]*3600+a[2]*60+a[3])-(b[1]*3600+b[2]*60+b[3]))/3600)}}'

Kindly suggest plz.

Regards
Jaydeep Sadaria

I'm no expert with awk, but here's something i'd like to share:

While i do agree that one-liners are cool, there are occasions it just makes no sense.
Saying, a well formated code is easier to read - and find issues/improvements, than within a one liner of that length. (me have FHD (1920x1080) display, and i need to scroll sideways)

This said, you might want to use a function (rather than an if-block) to transform time and date to seconds and to avoid things like:

... +((0*3600+0*60+0)+ ..

For which you could have just written +0.

Once you transformed the date+time to seconds, you simply subtract the one from the other and get the difference.

Hope my 2 cents help

With GNU date:

d1=$(date -d "20150802 11:30:45" +%s)
d2=$(date -d "20150728 16:30:45" +%s)
diff=$(( d1 - d2 )) # This gives the difference between the two dates in seconds.

You having said "... date -d or date -- day is not working in mine system." , what IS working on your system? What's your OS, shell, date version?

Its SunOS 5.10. Only -a and-u option available. Below is op of man date.

Reformatting page.  Please Wait... done

User Commands                                             date(1)

NAME
     date - write the date and time

SYNOPSIS
     /usr/bin/date [-u] [ +format]

     /usr/bin/date [ -a  [-]sss.fff]

     /usr/bin/date [-u] [ [mmdd] HHMM |  mmddHHMM [cc] yy]  [.SS]

     /usr/xpg4/bin/date [-u] [ +format]

     /usr/xpg4/bin/date [ -a  [-]sss.fff]

     /usr/xpg4/bin/date [-u] [ [mmdd] HHMM |  mmddHHMM  [cc]  yy]
     [.SS]

DESCRIPTION
     The date utility writes the date and time to standard output
     or attempts to set the system date and time. By default, the
     current date and time is written.

     Specifications of native language translations of month  and
     weekday  names  are  supported.  The month and weekday names
     used for a language are based on the locale specified by the
     environment variable LC_TIME. See environ(5).

     The following is the default form for the "C" locale:

     %a %b %e %T %Z %Y

     For example,

     Fri Dec 23 10:10:42 EST 1988

OPTIONS
     The following options are supported:

     -a [-]sss.fff   Slowly adjust the time  by  sss.fff  seconds
                     (fff represents fractions of a second). This
                     adjustment can be positive or negative.  The
                     system's  clock  is  sped  up or slowed down
                     until  it  has  drifted  by  the  number  of
                     seconds  specified.  Only the super-user may
                     adjust the time.

     -u              Display (or set) the date in Greenwich  Mean
                     Time  (GMT-universal  time),  bypassing  the
                     normal conversion to (or from) local time.

SunOS 5.10          Last change: 11 May 2004                    1

User Commands                                             date(1)

OPERANDS
     The following operands are supported:

     +format         If the argument begins with +, the output of
                     date is the result of passing format and the
                     current time to strftime().  date  uses  the
                     conversion   specifications  listed  on  the
                     strftime(3C) manual page, with  the  conver-
                     sion  specification  for  %C  determined  by
                     whether /usr/bin/date or  /usr/xpg4/bin/date
                     is used:

                     /usr/bin/date           Locale's  date   and
                                             time representation.
                                             This is the  default
                                             output for date.

                     /usr/xpg4/bin/date      Century   (a    year
                                             divided  by  100 and
                                             truncated   to    an
                                             integer)     as    a
                                             decimal number  [00-
                                             99].

                     The string is always terminated with a  NEW-
                     LINE.  An argument containing blanks must be
                     quoted; see the EXAMPLES section.

     mm              Month number

     dd              Day number in the month

     HH              Hour number (24 hour system)

     MM              Minute number

     SS              Second number

SunOS 5.10          Last change: 11 May 2004                    2

User Commands                                             date(1)

     cc              Century (a year divided by 100 and truncated
                     to  an integer) as a decimal number [00-99].
                     For example, cc is 19 for the year 1988  and
                     20 for the year 2007.

     yy              Last two digits of the year number. If  cen-
                     tury  (cc)  is not specified, then values in
                     the range 69-99 shall refer to years 1969 to
                     1999  inclusive,  and  values  in  the range
                     00-68 shall refer to  years  2000  to  2068,
                     inclusive.

     The month, day, year number, and century may be omitted; the
     current  values  are  applied  as defaults. For example, the
     following entry:

     example% date 10080045

     sets the date to Oct 8, 12:45 a.m. The current year  is  the
     default  because no year is supplied. The system operates in
     GMT. date takes care of the conversion  to  and  from  local
     standard  and  daylight time. Only the super-user may change
     the date. After successfully setting the date and time, date
     displays  the  new date according to the default format. The
     date command uses TZ to  determine  the  correct  time  zone
     information; see environ(5).

EXAMPLES
     Example 1: Generating Output

     The following command:

     example% date '+DATE: %m/%d/%y%nTIME:%H:%M:%S'

     generates as output

     DATE: 08/01/76

     TIME: 14:45:05

     Example 2: Setting the Current Time

     The following command sets the current time to 12:34:56:

     example# date 1234.56

SunOS 5.10          Last change: 11 May 2004                    3

User Commands                                             date(1)

     Example 3: Setting Another Time and Date in  Greenwich  Mean
     Time

     The following command sets the date to  January  1st,  12:30
     am, 2000:

     example# date -u 010100302000

     This is displayed as:

    Thu Jan 01 00:30:00 GMT 2000

ENVIRONMENT VARIABLES
     See environ(5) for descriptions of the following environment
     variables  that  affect the execution of date: LANG, LC_ALL,
     LC_CTYPE, LC_TIME, LC_MESSAGES, and NLSPATH.

     TZ       Determine the timezone in which the time  and  date
              are  written, unless the -u option is specified. If
              the TZ variable is not set and the -u is not speci-
              fied, the system default timezone is used.

EXIT STATUS
     The following exit values are returned:

     0        Successful completion.

     >0       An error occurred.

ATTRIBUTES
     See attributes(5) for descriptions of the  following  attri-
     butes:

  /usr/bin/date
     ____________________________________________________________
    |       ATTRIBUTE TYPE        |       ATTRIBUTE VALUE       |
    |_____________________________|_____________________________|
    | Availability                | SUNWcsu                     |
    |_____________________________|_____________________________|
    | CSI                         | enabled                     |
    |_____________________________|_____________________________|

  /usr/xpg4/bin/date

SunOS 5.10          Last change: 11 May 2004                    4

User Commands                                             date(1)

     ____________________________________________________________
    |       ATTRIBUTE TYPE        |       ATTRIBUTE VALUE       |
    |_____________________________|_____________________________|
    | Availability                | SUNWxcu4                    |
    |_____________________________|_____________________________|
    | CSI                         | enabled                     |
    |_____________________________|_____________________________|
    | Interface Stability         | Standard                    |
    |_____________________________|_____________________________|

SEE ALSO
     strftime(3C), attributes(5), environ(5), standards(5)

DIAGNOSTICS
     no permission           You are not the super-user  and  you
                             tried to change the date.

     bad conversion          The  date   set   is   syntactically
                             incorrect.

Are you sure its the only available date on your system?

find / -name date 2>/dev/zero

2004 seems rather old to me.

If you are allowed, install the GNU utilities

Hi.

On a system I use, GNU date is installed as gdate in /opt/csw :

/opt/csw/bin/gdate
OS, ker|rel, machine: SunOS, 5.10, i86pc
Distribution        : Solaris 10 10/08 s10x_u6wos_07b X86
gdate date (GNU coreutils) 8.22

See also http://www.unix.com/shell-programming-scripting/242073-display-previous-days-dates-ksh.html for a demonstration of dateutils package in Solaris.

Best wishes ... cheers, drl