This happens each time c2
increments the 100's digit. I uncommented print(c2, ct)
to demonstrate:
100057 100031
Time elapsed: 00:00:26
100058 100031
Time elapsed: 00:00:27
100059 100031
Time elapsed: 00:00:28
100100 100031
Time elapsed: 00:01:09
100101 100031
Time elapsed: 00:01:10
Why
Note the jump in ct2
from 100059 to 100100. This happens because the code converts a str
to an int
: ct2 = int(time.strftime('%H%M%S',t))
. The str
is actually a base24 digit followed by two base60 digits and should never be converted to an integer. This only works because t
isn't in the 0th hour of the day, e.g. 00:00:10.
Solution
A solution is to get the time as UNIX time, perform the arithmetic, and convert it to the format you want.
import time
start_time = time.time()
while True:
current_time = time.time()
time_elapsed = current_time - start_time
print(f'Time elapsed: {time.strftime("%H:%M:%S", time.gmtime(time_elapsed))}')
time.sleep(1)
Now, this solution will fail if more than 86400s (one day) has elapsed. For example: when exactly 25 hours have elapsed, this solution will print 01:00:00
.
Another solution is to use builtin date/time arithmetic, which returns a datetime.timedelta
.
from datetime import datetime, timedelta
import time
start_time = datetime.now()
while True:
current_time = datetime.now()
time_elapsed = timedelta(current_time - start_time)
print(f'Time elapsed: {time_elapsed}')
time.sleep(1)
Note that this solution outputs a slightly different format for elapsed time under 24 hours, afterwards its output looks like this:
1 day, 16:00:10
Advice
Stop trying to do your own date/time arithmetic. It's much more difficult than most people realize, and a constant source of material for The Daily WTF. Anytime a programmer tries to mangle dates or times on their own I point them at this list (content reproduced below).
Falsehoods programmers believe about time
This is a compiled list of falsehoods programmers tend to believe about working with time.
Don't re-invent a date time library yourself.
If you think you understand everything about time, you're probably doing it wrong.
Falsehoods
- There are always 24 hours in a day.
- February is always 28 days long.
- Any 24-hour period will always begin and end in the same day (or week, or month).
- A week always begins and ends in the same month.
- A week (or a month) always begins and ends in the same year.
- The machine that a program runs on will always be in the
GMT
time zone.
- Ok, that’s not true. But at least the time zone in which a program has to run will never change.
- Well, surely there will never be a change to the time zone in which a program hast to run in production.
- The system clock will always be set to the correct local time.
- The system clock will always be set to a time that is not wildly different from the correct local time.
- If the system clock is incorrect, it will at least always be off by a consistent number of seconds.
- The server clock and the client clock will always be set to the same time.
- The server clock and the client clock will always be set to around the same time.
- Ok, but the time on the server clock and time on the client clock would never be different by a matter of decades.
- If the server clock and the client clock are not in synch, they will at least always be out of synch by a consistent number of seconds.
- The server clock and the client clock will use the same time zone.
- The system clock will never be set to a time that is in the distant past or the far future.
- Time has no beginning and no end.
- One minute on the system clock has exactly the same duration as one minute on any other clock
- Ok, but the duration of one minute on the system clock will be pretty close to the duration of one minute on most other clocks.
- Fine, but the duration of one minute on the system clock would never be more than an hour.
- The smallest unit of time is one second.
- Ok, one millisecond.
- It will never be necessary to set the system time to any value other than the correct local time.
- Ok, testing might require setting the system time to a value other than the correct local time but it will never be necessary to do so in production.
- Time stamps will always be specified in a commonly-understood format like
1339972628
or 133997262837
.
- Time stamps will always be specified in the same format.
- Time stamps will always have the same level of precision.
- A time stamp of sufficient precision can safely be considered unique.
- A timestamp represents the time that an event actually occurred.
- Human-readable dates can be specified in universally understood formats such as
05/07/11
.
- The offsets between two time zones will remain constant.
- OK, historical oddities aside, the offsets between two time zones won’t change in the future.
- Changes in the offsets between time zones will occur with plenty of advance notice.
- Daylight saving time happens at the same time every year.
- Daylight saving time happens at the same time in every time zone.
- Daylight saving time always adjusts by an hour.
- Months have either 28, 29, 30, or 31 days.
- The day of the month always advances contiguously from
N
to either N+1
or 1
, with no discontinuities.
- There is only one calendar system in use at one time.
- There is a leap year every year divisible by 4.
- Non leap years will never contain a leap day.
- It will be easy to calculate the duration of x number of hours and minutes from a particular point in time.
- The same month has the same number of days in it everywhere!
- Unix time is completely ignorant about anything except seconds.
- Unix time is the number of seconds since Jan 1st 1970.
- The day before Saturday is always Friday.
- Contiguous timezones are no more than an hour apart. (aka we don’t need to test what happens to the avionics when you fly over the International Date Line)
- Two timezones that differ will differ by an integer number of half hours.
- Okay, quarter hours.
- Okay, seconds, but it will be a consistent difference if we ignore
DST
.
- If you create two date objects right beside each other, they’ll represent the same time. (a fantastic Heisenbug generator)
- You can wait for the clock to reach exactly
HH:MM:SS
by sampling once a second.
- If a process runs for
n
seconds and then terminates, approximately n
seconds will have elapsed on the system clock at the time of termination.
- Weeks start on Monday.
- Days begin in the morning.
- Holidays span an integer number of whole days.
- The weekend consists of Saturday and Sunday.
- It’s possible to establish a total ordering on timestamps that is useful outside your system.
- The local time offset (from
UTC
) will not change during office hours.
Thread.sleep(1000)
sleeps for 1000 milliseconds.
Thread.sleep(1000)
sleeps for >=
1000 milliseconds.
- There are 60 seconds in every minute.
- Timestamps always advance monotonically.
GMT
and UTC
are the same timezone.
- Britain uses
GMT
.
- Time always goes forwards.
- The difference between the current time and one week from the current time is always
7 * 86400
seconds.
- The difference between two timestamps is an accurate measure of the time that elapsed between them.
24:12:34
is a invalid time.
- Every integer is a theoretical possible year.
- If you display a datetime, the displayed time has the same second part as the stored time,
- Or the same year,
- But at least the numerical difference between the displayed and stored year will be less than 2.
- If you have a date in a correct
YYYY-MM-DD
format, the year consists of four characters.
- If you merge two dates, by taking the month from the first and the day/year from the second, you get a valid date.
- But it will work, if both years are leap years
- If you take a w3c published algorithm for adding durations to dates, it will work in all cases.
- The standard library supports negative years and years above 10000.
- Time zones always differ by a whole hour.
- If you convert a timestamp with millisecond precision to a date time with second precision, you can safely ignore the millisecond fractions.
- But you can ignore the millisecond fraction, if it is less than 0.5.
- Two-digit years should be somewhere in the range 1900-2099.
- If you parse a date time, you can read the numbers character for character, without needing to backtrack.
- But if you print a date time, you can write the numbers character for character, without needing to backtrack.
- You will never have to parse a format like
---12Z
or P12Y34M56DT78H90M12.345S
.
- There are only 24 time zones.
- Time zones are always whole hours away from UTC.
- Daylight Saving Time (DST) starts/ends on the same date everywhere.
- DST is always an advancement by 1 hour.
- Reading the client’s clock and comparing to UTC is a good way to determine their timezone.
- The software stack will/won’t try to automatically adjust for timezone/DST.
- My software is only used internally/locally, so I don’t have to worry about timezones.
- My software stack will handle it without me needing to do anything special.
- I can easily maintain a timezone list myself.
- All measurements of time on a given clock will occur within the same frame of reference.
- The fact that a date-based function works now means it will work on any date.
- Years have 365 or 366 days.
- Each calendar date is followed by the next in sequence, without skipping.
- A given date and/or time unambiguously identifies a unique moment.
- Leap years occur every 4 years.
- You can determine the time zone from the state/province.
- You can determine the time zone from the city/town.
- Time passes at the same speed on top of a mountain and at the bottom of a valley.
- One hour is as long as the next in all time systems.
- You can calculate when leap seconds will be added.
- The precision of the data type returned by a
getCurrentTime()
function is the same as the precision of that function.
- Two subsequent calls to a
getCurrentTime()
function will return distinct results.
- The second of two subsequent calls to a
getCurrentTime()
function will return a larger result.
- The software will never run on a space ship that is orbiting a black hole.
- Devices will be set to the local timezone
- Users prefer to use the local timezone
Sources
This list is based on these articles.
More detailed information about each statement can be found in one of two articles.