There are two common occasions when you might want to get a timestamp
- If you want to create a logfile called “myapp_log.11.Mar.2007”
- If you want to write to a logfile with “myapp: 11 Mar 2007 22:14:44: Something Happened”
Either way, you want to get the current date, in the format you prefer – for example, it’s easier if a filename doesn’t include spaces.
For the purposes of this article, though for no particular reason, I am assuming that the current time is 10:14:44 PM on Sunday the 11th March 2007.
The tool to use is, naturally enough, called “
date“. It has a bucket-load of switches, but first, we’ll deal with how to use them. For the full list, see the man page (“
man date“), though I’ll cover some of the more generally useful ones below.
Setting the Date/Time
The first thing to note, is that
date has two aspects: It can set the system clock:
# date 031122142007.44
will set the clock to 03 11 22 14 2007 44 – that is, 03=March, 11=11th day, 22 = 10pm, 14 = 14 minutes past the hour, 2007 = year 2007, 44 = 44 seconds past the minute.
Heck, I don’t even know why I bothered to spell it out, it’s obvious. Of course the year should come between the minutes and the seconds (ahem).
Getting the Date/Time
The more often used feature of the
date command, is to find the current system date / time, and that is what we shall focus on here. It doesn’t follow tradition, in that it uses the “
+” and “
%” symbols, instead of the “
-” symbol, for its switches.
H = Hours, M = Minutes, S = Seconds, so:
$ date +%H:%M:%S 22:14:44
Which means that you can name a logfile like this:
#!/bin/sh LOGFILE=/tmp/log_`date +%H%M%S`.log echo Starting work > $LOGFILE do_stuff >> $LOGFILE do_more_stuff >> $LOGFILE echo Finished >> $LOGFILE
This will create a logfile called /tmp/log_221444.log
You can also put useful information to the logfile:
#!/bin/sh LOGFILE=/tmp/log_`date +%H%M%S`.log echo `date +%H:%M:%S : Starting work > $LOGFILE do_stuff >> $LOGFILE echo "`date +%H:%M:%S : Done do_stuff" >> $LOGFILE do_more_stuff >> $LOGFILE echo "`date +%H:%M:%S : Done do_more_stuff" >> $LOGFILE echo Finished >> $LOGFILE
This will produce a logfile along the lines of:
$ cat /tmp/log_221444.log 22:14:44: Starting work do_stuff : Doing stuff, takes a short while 22:14:53: Done do_stuff do_more_stuff : Doing more stuff, this is quite time consuming. 22:18:35: Done do_more_stuff $
Counting the Seconds
UNIX has 1st Jan 1970 as a “special” date, the start of the system clock; GNU
date will tell you how many seconds have elapsed since midnight on 1st Jan 1970:
$ date +%s 1173651284
Whilst this information is not very useful in itself, it may be useful to know how many seconds have elapsed between two events:
$ cat list.sh #!/bin/sh start=`date +%s` ls -R $1 > /dev/null 2>&1 end=`date +%s` diff=`expr $end - $start` echo "Started at $start : Ended at $end" echo "Elapsed time = $diff seconds" $ ./list.sh /usr/share Started at 1173651284 : Ended at 1173651290 Elapsed time = 6 seconds $
For more useful switches, see the man page, but here are a few handy ones:
$ date "+%a %b %d" # (in the local language) Sun Mar 11 $ date +%D # (show the full date) 03/11/07 $ date +%F # (In another format) 2007-03-11 $ date +%j # (how many days into the year) 070 $ date +%u # (day of the week) 7 $