Question

I've been writing a time converter to take the systems time_t and convert it into human readable date/time. Oh, and this is my second python script ever. We'll leave that fact aside and move on.

The full script is hosted here.

Writing converters for the year and month were fairly easy, but I've hit a serious brick wall trying to get the day working. As you can see, I've been trying to brute-force my way all the way from 1970 to today. Unfortunately, the day comes out as -105.

Does anyone know of a better way to do it, or a way to fix up what I have attempted here? It's currently 3:30 AM, so it's quite possible I'm missing something obvious.

Sorry, I forgot to note that I'm doing this manually in order to learn python. Doing it via date functions defeats the purpose, unfortunately.

Was it helpful?

Solution

(I'm assuming you do this to learn Python, so I'll point out the errors in your code).

>>> years = SecondsSinceEpoch / 31540000

Nonononono. You can't do that. Some years have 31536000 seconds, others have 31622400 seconds.

>>> if calendar.isleap(yeariterator) == True:

You don't need to test if a true value is true. :-) Do:

>>> if calendar.isleap(yeariterator):

Instead.

Also change:

>>> yeariterator = 1969
>>> iterator = 0
>>> while yeariterator < yearsfordayfunction:
>>>     yeariterator = yeariterator + 1

To:

for yeariterator in range(1970, yearsfordayfunction):

That will also fix your error: You don't stop until AFTER 2009, so you get the answer -105, because there is 105 days left of the year.

And also, there's not much point in calculating month by month. Year by year works fine.

    for yeariterator in range(1970, yearsfordayfunction):
            if calendar.isleap(yeariterator) == True:
                    days = days - 366
            else:
                    days = days - 365

And an indent of 8 spaces is a lot. 4 is more common.

Also, I'd calculate year and day of year in one method, instead of doing it twice.

def YearDay():
    SecondsSinceEpoch = int(time.time())
    days = SecondsSinceEpoch // 86400 # Double slash means floored int.
    year = 1970
    while True:
            if calendar.isleap(year):
                    days -= 366
            else:
                    days -= 365
            year += 1
            if calendar.isleap(year):
                    if days <= 366:
                            return year, days
            else:
                    if days <= 365:
                            return year, days


def MonthDay(year, day):
    if calendar.isleap(year):
            monthstarts = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]
    else:
            monthstarts = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365]

    month = 0
    for start in monthstarts:
            if start > day:
                    return month, day - monthstarts[month-1] + 1
            month += 1

OTHER TIPS

Why not use:

from datetime import datetime
the_date = datetime.fromtimestamp(the_time)
print(the_date.strftime('%Y %B %d'))

The datetime module handles all the edge cases -- leap years, leap seconds, leap days -- as well as time zone conversion (with optional second argument)

You could do it either with time.strftime:

>>> import time
>>> time.strftime('%Y %B %d')
'2009 September 18'

or with datetime.date.strftime:

>>> import datetime
>>> datetime.date.today().strftime('%Y %B %d')
'2009 September 18'

I'll also point out something odd in the code you posted:

    try:
            SecondsSinceEpoch = time.time()
    except IOError:
            Print("Unable to get your system time!")

1.) Why would time.time() raise an IOError? As far as I know it's impossible for that function to raise an error, it should always return a value.

2.) Print should be print.

3.) Even if time.time did raise an IOError exception, you are swallowing the exception, which you probably don't want to do. The next line requires SecondsSinceEpoch to be defined, so that will just raise another (more confusing) exception.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top