0

I want to ask your that how to determine & convert current time to no of seconds elapsed during current day?

Actually, I want to show how long is midnight from now in seconds. As total seconds in a day is 86400 so I'll subtract current time (in seconds elapsed since this day) with 86400.

EDIT:

Here is the actual question. If date -d is not working then how can our instructor give question like this. There might be a way maybe. Anyone understand this question. They have a different way that is subract from no of seconds.

enter image description here

Zeus
  • 111
  • 2
  • Hey @steeldriver can you tell me is there any other way than -d parameter in date command to calculate no of seconds until midnight. Solution below is great, but -d is ot working. Thanks – Zeus Jul 16 '16 at 02:40
  • Sorry I'm not familiar with other implementations of the date command - for a more platform-independent solution you might want to look at languages that provide their own datetime functions, such as perl – steeldriver Jul 16 '16 at 02:45
  • @steeldriver Thanks can you please help me. I have posted the actual question PIC also. There might be a way or a hint in the question if date -d doesn't work. Any idea? – Zeus Jul 16 '16 at 02:50
  • Well, you can trivially get the elapsed seconds since 00:00:00 today using date with respectively +%H, +%M, +%S and basic arithmetic (in the syntax appropriate for the shell of your instructor's choice). Then - assuming you aren't expected to account for the possibility of leap seconds occurring before tomorrow - simple subtraction will give you the number of seconds remaining until next 00:00:00 – steeldriver Jul 16 '16 at 03:33

4 Answers4

3

Assuming you have GNU date (or another date program that understands -d and works properly) and using bash:

You can use the -d flag to report time at various points. So, for example

% date -d "00:00:00 tomorrow"
Sat Jul 16 00:00:00 EDT 2016

We can use this to report on seconds with +%s

% date -d "00:00:00 tomorrow" +%s
1468641600

We know our current time, in seconds:

% date +%s                       
1468633682

So we can calculate the difference:

% secs_left=$(( $(date -d "00:00:00 tomorrow" +%s) - $(date +%s) ))
% echo $secs_left
7871

(Which is about right; 7871 seconds is 2hrs 11mins and 11 seconds, which is correct for when I ran that command).

EDIT for csh as requested:

In csh the similar command would be

% @ secs_left = ( `date -d "00:00:00 tomorrow" +%s` - `date +%s` )
% echo $secs_left
7871
  • Hey bro, really sorry to tell you I am bound to use Csh. Can you please tell in that. Thanks – Zeus Jul 16 '16 at 02:05
  • csh commands added, but I really don't recommend you write code in csh - see https://www-uxsup.csx.cam.ac.uk/misc/csh.html for reasons. Long term you'll be grateful to learn bash syntax! – Stephen Harris Jul 16 '16 at 02:12
  • Yes! I agree. it was our instructor's choice. And is there any other way than -d parameter? In Gator date works date -u also works but not date -d. Thanks – Zeus Jul 16 '16 at 02:14
  • Although it didn't helped me much as I'm still stucked in date -d error , but your asnwer is definitely great. So, you deserve accept asnwer. Thanks . If possilbe kindly help – Zeus Jul 16 '16 at 03:22
  • Your instructor is expecting you to call date with +%H to get the current hours, with %+M to get current minutes and %+S to get seconds. From there you can calculate (similar to the @ line in my answer) the number of seconds from midnight. At this point you have all the information you need to do the calculation. – Stephen Harris Jul 16 '16 at 03:47
  • you are using '+%s' but that is not allowed, only '+%S' – Jasen Jul 16 '16 at 08:58
1

Try:

eval "`date +'@ s = (86400 - %S) - 60 * (%M + 60 * %H)'`"; echo $s

However note that in timezones that have winter and summer time, it won't give the right result if called on the day of the switch from/to summer time, before the switch (which generally happen very early in the morning).

Beware that in csh, arithmetic operators are right-associative with */ having precedence over +-, as in

@ s = 1 - 2 + 3 - 4

is

@ s = 1 - (2 + (3 - 4))

And not:

@ s = (((1 - 2) + 3) - 4)

as in other languages. That was fixed in tcsh (6.15.01), and you can run set compat_expr to get back to the older behaviour there.

Hence the parentheses around 86400 - %S so it works in both csh and tcsh.

  • yo man! it worked :D :D :D Thanks man. The other solution were great, but this one worked for me so I changed my accept answer and also they got their upvotes so I hope they won't mind. But I didn't get what you said about timezones. I live in Vancouver, British Columbia, Canada with Pacific Standard Time. – Zeus Jul 16 '16 at 16:27
  • @Tony, in Vancouver, 2016-11-06 is a 25 hour long day for instance. At 02:00, the clock goes back to 01:00 again to switch to winter time which adds an extra hour. If you run that command at 00:30 before the switch, that's 24.5 hours before midnight, but that command will report 23.5 hours because it calculates 24 hours take away the current time. – Stéphane Chazelas Jul 16 '16 at 17:09
  • At that time our course would have been finished :D, but thanks a lot for this information. – Zeus Jul 16 '16 at 17:17
  • Dear Stephane, could you please help me in this question? You are a genius. Hope you don't mind. http://unix.stackexchange.com/questions/296372/how-to-determine-current-users-who-are-logged-in-using-a-specific-domain-unix – Zeus Jul 17 '16 at 00:21
1

in csh it is pretty simple:

    set start_time = `date +%s`
    set end_time = `date +%s`
    @ time_elapsed = $end_time - $start_time
    echo "$time_elapsed time elapsed in seconds"
    @ time_elapsed = `date -u -r $time_elapsed +%T`
    echo = "$time_elapsed time elapsed in hh:mm:ss format"
0

this reads like a homework question.

given that you are constrained to only getting hours minutes and seconds you will have to take those numbers and do arithmentic. the arithmetic is not complex, I'm sure you can work it out.

this will not give a reliable result because there is a race condition if the minute changes during the determination of those three input values so steps should be taken to detect this fault and correct for it.

use the result form @StevenHaris' answer to confirm your calculations are correct,

Jasen
  • 3,761