Unix: sleep until the specified time

If you're on a Unix that has a decent date command and are using bash, you could use the %s format for calculating time.

sleep $(( $(date -j 1700 +%s) - $(date +%s) ))
  • 1700 being 5PM.
  • -j telling date not to actually set the date.

How about this (combining w00t's and Gille's ideas into a function)?

function sleep_until {
  seconds=$(( $(date -d "$*" +%s) - $(date +%s) )) # Use $* to eliminate need for quotes
  echo "Sleeping for $seconds seconds"
  sleep $seconds
}

Usage:

sleep_until 8:24
Sleeping for 35 seconds

sleep_until '23:00'
Sleeping for 52489 seconds

sleep_until 'tomorrow 1:00'
Sleeping for 59682 seconds

Check out the linux/unix at command. Using the 5AM example:

at 05:00 some_command

It also supports timezones:

A timezone name of GMT, UCT or ZULU (case insensitive) can follow to specify that the time is in Coordinated Universal Time. Other timezones can be specified using the TZ environment variable.