Mercurial > hg > config
comparison python/parse_date.py @ 716:ca1f21d9e621
parse date example
| author | Jeff Hammel <k0scist@gmail.com> |
|---|---|
| date | Thu, 23 Oct 2014 14:08:17 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 715:beb501ba919f | 716:ca1f21d9e621 |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 # -*- coding: utf-8 -*- | |
| 3 | |
| 4 """ | |
| 5 parse date | |
| 6 """ | |
| 7 | |
| 8 # imports | |
| 9 import argparse | |
| 10 import calendar | |
| 11 import datetime | |
| 12 import sys | |
| 13 import time | |
| 14 from .formatting import format_table | |
| 15 from dateutil.parser import parse | |
| 16 | |
| 17 | |
| 18 __all__ = ['main', 'parse_date', 'epoch2local', 'epoch2utc', 'is_dst', 'timezone'] | |
| 19 | |
| 20 | |
| 21 def is_dst(localtime=None): | |
| 22 """returns if daylight savings time is in effect locally""" | |
| 23 return time.localtime(localtime).tm_isdst > 0 | |
| 24 | |
| 25 | |
| 26 def timezone(localtime=None): | |
| 27 """returns name of local timezone""" | |
| 28 return time.tzname[int(is_dst(localtime))] | |
| 29 | |
| 30 | |
| 31 def epoch2local(datestamp): | |
| 32 """convert epoch to local time""" | |
| 33 return datetime.datetime.fromtimestamp(float(datestamp)) | |
| 34 | |
| 35 | |
| 36 def epoch2utc(datestamp): | |
| 37 """convert epoch to UTC""" | |
| 38 return datetime.datetime.utcfromtimestamp(float(datestamp)) | |
| 39 | |
| 40 | |
| 41 def parse_date(datestamp, utc=False): | |
| 42 """returns seconds since epoch from the supplied date""" | |
| 43 | |
| 44 try: | |
| 45 # already epoch timestamp | |
| 46 return float(datestamp) | |
| 47 except ValueError: | |
| 48 pass | |
| 49 | |
| 50 # parse the string | |
| 51 parsed_date = parse(datestamp) | |
| 52 | |
| 53 # convert this to seconds since epoch | |
| 54 if utc: | |
| 55 return float(calendar.timegm(parsed_date.timetuple())) | |
| 56 else: | |
| 57 return time.mktime(parsed_date.timetuple()) | |
| 58 | |
| 59 | |
| 60 def main(args=sys.argv[1:]): | |
| 61 | |
| 62 # parse command line | |
| 63 parser = argparse.ArgumentParser(description=__doc__) | |
| 64 parser.add_argument('date', nargs='+', | |
| 65 help="local date to parse") | |
| 66 parser.add_argument('--utc', dest='utc', | |
| 67 action='store_true', default=False, | |
| 68 help="indicate date is in UTC") | |
| 69 options = parser.parse_args(args) | |
| 70 | |
| 71 # parse each date | |
| 72 epochs = [parse_date(d, options.utc) for d in options.date] | |
| 73 | |
| 74 # display results | |
| 75 header = ['epoch', 'local', 'UTC'] | |
| 76 print (format_table([[d, '{} {}'.format(epoch2local(d), timezone(d)), epoch2utc(d)] for d in epochs], | |
| 77 header=header, joiner='|')) | |
| 78 | |
| 79 | |
| 80 if __name__ == '__main__': | |
| 81 main() |
