Difference between two times (working ugly code, needs polish)

Discussion in 'Python' started by Bruno Desthuilliers, Sep 9, 2007.

  1. Shawn Milochik a écrit :
    > I have done what I wanted, but I think there must be a much better way.
    >
    > Given two timestamps in the following format, I just want to figure
    > out how far apart they are (in days, seconds, whatever).
    >
    > Format:
    >
    > YYYY-MM-DD_MM:SS
    >
    > Example:
    > 2007-09-11_16:41
    >
    >
    > It seems to me that to do what I want, I need to convert a string into
    > a number (time.mktime()), such as this: 1189543487.0
    >
    > Once I have that, I can just subtract one from the other and do
    > whatever I want. The ugly part is converting something like
    > 2007-09-11_16:41 to the numeric equivalent.
    >
    > Below is my code. Any suggestions?


    import time
    print time.mktime(time.strptime("2007-09-11_16:41", '%Y-%m-%d_%H:%M'))
    => 1189521660.0

    FWIW, you may also want to have a look at the datetime module, with
    special attention to the timedelta class.

    HTH
     
    Bruno Desthuilliers, Sep 9, 2007
    #1
    1. Advertising

  2. I have done what I wanted, but I think there must be a much better way.

    Given two timestamps in the following format, I just want to figure
    out how far apart they are (in days, seconds, whatever).

    Format:

    YYYY-MM-DD_MM:SS

    Example:
    2007-09-11_16:41


    It seems to me that to do what I want, I need to convert a string into
    a number (time.mktime()), such as this: 1189543487.0

    Once I have that, I can just subtract one from the other and do
    whatever I want. The ugly part is converting something like
    2007-09-11_16:41 to the numeric equivalent.

    Below is my code. Any suggestions?

    Thanks in advance.


    Here is what I have (works):

    #runTimeStamp is the current time, set when the script begins execution
    def recAge(lastUpdate, runTimeStamp):

    import re

    oneDay = 60 * 60 * 24

    lastUpdate = re.sub(r'\D+', ',', lastUpdate)
    lastUpdate = lastUpdate + ",0,0,0,0"
    lastUpdate = [int(x) for x in lastUpdate.split(',')]
    lastUpdate = time.mktime(tuple(lastUpdate))

    runTimeStamp = re.sub(r'\D+', ',', runTimeStamp)
    runTimeStamp = runTimeStamp + ",0,0,0,0"
    runTimeStamp = [int(x) for x in runTimeStamp.split(',')]
    runTimeStamp = time.mktime(tuple(runTimeStamp))

    return (runTimeStamp - lastUpdate) / oneDay
     
    Shawn Milochik, Sep 11, 2007
    #2
    1. Advertising

  3. Grant Edwards, Sep 11, 2007
    #3
  4. On 9/11/07, Grant Edwards <> wrote:
    > On 2007-09-11, Shawn Milochik <> wrote:
    >
    > > I have done what I wanted, but I think there must be a much better way.

    >
    > See the strptime() function in either the time or the datetime
    > modules:
    >
    > http://docs.python.org/lib/module-time.html
    > http://docs.python.org/lib/module-datetime.html
    >



    Grant:

    Thanks, this works, and is much shorter. Any further improvements, anyone?

    def isOld(lastUpdate, runTimeStamp):

    oneDay = 60 * 60 * 24

    lastUpdate = time.mktime(time.strptime(lastUpdate, "%Y-%m-%d_%H:%M"))
    runTimeStamp = time.mktime(time.strptime(runTimeStamp, "%Y-%m-%d_%H:%M"))

    return (runTimeStamp - lastUpdate) / oneDay
     
    Shawn Milochik, Sep 11, 2007
    #4
  5. Bruno Desthuilliers

    Steve Holden Guest

    Shawn Milochik wrote:
    > On 9/11/07, Grant Edwards <> wrote:
    >> On 2007-09-11, Shawn Milochik <> wrote:
    >>
    >>> I have done what I wanted, but I think there must be a much better way.

    >> See the strptime() function in either the time or the datetime
    >> modules:
    >>
    >> http://docs.python.org/lib/module-time.html
    >> http://docs.python.org/lib/module-datetime.html
    >>

    >
    >
    > Grant:
    >
    > Thanks, this works, and is much shorter. Any further improvements, anyone?
    >
    > def isOld(lastUpdate, runTimeStamp):
    >
    > oneDay = 60 * 60 * 24
    >
    > lastUpdate = time.mktime(time.strptime(lastUpdate, "%Y-%m-%d_%H:%M"))
    > runTimeStamp = time.mktime(time.strptime(runTimeStamp, "%Y-%m-%d_%H:%M"))
    >
    > return (runTimeStamp - lastUpdate) / oneDay


    I suppose really oneDay should be a global (i.e. outside the function
    definition). Apart from that it would be hard to improve on: obvious,
    easy to read, in short - pythonic.

    Are you concerned about daylight savings? That could certainly introduce
    a whole new level of complexity into the problem. Let's hope not ...


    --
    Steve Holden +1 571 484 6266 +1 800 494 3119
    Holden Web LLC/Ltd http://www.holdenweb.com
    Skype: holdenweb http://del.icio.us/steve.holden
    --------------- Asciimercial ------------------
    Get on the web: Blog, lens and tag the Internet
    Many services currently offer free registration
    ----------- Thank You for Reading -------------
     
    Steve Holden, Sep 11, 2007
    #5
  6. >
    > I suppose really oneDay should be a global (i.e. outside the function
    > definition). Apart from that it would be hard to improve on: obvious,
    > easy to read, in short - pythonic.
    >
    > Are you concerned about daylight savings? That could certainly introduce
    > a whole new level of complexity into the problem. Let's hope not ...


    I'm not concerned with DST; this is a script which checks my Ebay
    auctions (I have some things for sale), and sends me e-mail whenever
    someone bids. It's run by cron every half hour -- it keeps me from
    compulsively checking my auctions. ^_^

    In any case, DST isn't an issue because the same machine generates
    both timestamps, and all I use it for is to stop displaying auctions
    after they are 10 days old, so I don't get all my old crap filling up
    the alert e-mail or skewing the total dollar amount for all active
    auctions.

    Thanks.
    Shawn
     
    Shawn Milochik, Sep 12, 2007
    #6
  7. Bruno Desthuilliers

    Iain King Guest

    On Sep 12, 1:31 am, "Shawn Milochik" <> wrote:
    > > I suppose really oneDay should be a global (i.e. outside the function
    > > definition). Apart from that it would be hard to improve on: obvious,
    > > easy to read, in short - pythonic.

    >
    > > Are you concerned about daylight savings? That could certainly introduce
    > > a whole new level of complexity into the problem. Let's hope not ...

    >
    > I'm not concerned with DST; this is a script which checks my Ebay
    > auctions (I have some things for sale), and sends me e-mail whenever
    > someone bids. It's run by cron every half hour -- it keeps me from
    > compulsively checking my auctions. ^_^
    >
    > In any case, DST isn't an issue because the same machine generates
    > both timestamps, and all I use it for is to stop displaying auctions
    > after they are 10 days old, so I don't get all my old crap filling up
    > the alert e-mail or skewing the total dollar amount for all active
    > auctions.
    >
    > Thanks.
    > Shawn


    Just to be picky - your function returns the number of days between
    two dates, but it's called isOld, which looks like it should return a
    boolean. i.e. it looks like it would be used as:

    if not isOld(auctionDate, currentTime):
    checkForBid()

    rather than how I assume it is used:

    if isOld(auctionDate, currentTime) <= 10:
    checkForBid()

    I'd call it daysDiff or something similar, or make it more specific so
    that it works like the first block of code above:

    ONEDAY = 60*60*24
    OLDNESS_THRESHOLD = 10

    def isOld(lastUpdate, runTimeStamp):
    lastUpdate = time.mktime(time.strptime(lastUpdate, "%Y-%m-%d_%H:
    %M"))
    runTimeStamp = time.mktime(time.strptime(runTimeStamp, "%Y-%m-%d_
    %H:%M"))
    return (runTimeStamp - lastUpdate) / ONEDAY >= OLDNESS_THRESHOLD

    if not isOld(auctionDate, currentTime):
    checkForBid()

    Iain
     
    Iain King, Sep 12, 2007
    #7
  8. > Just to be picky - your function returns the number of days between
    > two dates, but it's called isOld, which looks like it should return a
    > boolean. i.e. it looks like it would be used as:
    >
    > if not isOld(auctionDate, currentTime):
    > checkForBid()
    >
    > rather than how I assume it is used:
    >
    > if isOld(auctionDate, currentTime) <= 10:
    > checkForBid()
    >
    > I'd call it daysDiff or something similar, or make it more specific so
    > that it works like the first block of code above:


    You're absolutely right; I started writing it with one purpose in mind
    and changed it midstream. I actually renamed it yesterday to dayDiff.
    ;o)

    Shawn
     
    Shawn Milochik, Sep 12, 2007
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. jakk
    Replies:
    4
    Views:
    12,233
  2. keithb
    Replies:
    1
    Views:
    917
    Bruce Barker
    Mar 29, 2006
  3. Tim Slattery

    Difference between two date/times

    Tim Slattery, Dec 11, 2008, in forum: Java
    Replies:
    15
    Views:
    3,529
    Stefan Ram
    Dec 14, 2008
  4. Michael
    Replies:
    7
    Views:
    950
    Bart van Ingen Schenau
    May 26, 2009
  5. Fendi Baba
    Replies:
    2
    Views:
    103
    Effendi Baba
    Jul 9, 2003
Loading...

Share This Page