Skip to content

Instantly share code, notes, and snippets.

@ouyi
Last active October 4, 2018 18:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ouyi/5724d0428dd1f10610f8526bb49117bf to your computer and use it in GitHub Desktop.
Save ouyi/5724d0428dd1f10610f8526bb49117bf to your computer and use it in GitHub Desktop.
A command-line tool to work with dates
#/usr/bin/env python
import sys, argparse, pytz
from datetime import datetime, timedelta
DEFAULT_DATETIME_FORMAT = '%Y%m%d'
SECONDS_IN_A_DAY = 3600 * 24
def main():
parser = argparse.ArgumentParser(description='A command-line tool to work with dates')
parser.add_argument('-a', '--range-start', help='the range start (inclusive)', required=True)
parser.add_argument('-o', '--range-stop', help='the range stop (exclusive)', required=True)
parser.add_argument('-e', '--range-step', default=SECONDS_IN_A_DAY, type=int, help='the range step, always in seconds')
parser.add_argument('-f', '--datetime-format', default=DEFAULT_DATETIME_FORMAT, help='the input and output datetime format, for details see: https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior')
args = parser.parse_args()
range_start = datetime.strptime(args.range_start, args.datetime_format).replace(tzinfo=pytz.UTC)
range_stop = datetime.strptime(args.range_stop, args.datetime_format).replace(tzinfo=pytz.UTC)
range_step = timedelta(seconds=args.range_step)
print_range(generate_range(range_start, range_stop, range_step), args.datetime_format)
def generate_range(start, stop, step):
result = []
d = start
while d < stop:
result.append(d)
d += step
return result
def print_range(datetime_range, datetime_format):
for d in datetime_range:
print(d.strftime(datetime_format))
if __name__ == "__main__":
main()
#/usr/bin/env python
from daterange import *
import unittest
class DaterangeTests(unittest.TestCase):
def test_generate_range(self):
datetime_format = '%Y-%m-%d'
range_start = datetime.strptime('2018-02-26', datetime_format).replace(tzinfo=pytz.UTC)
range_stop = datetime.strptime('2018-03-02', datetime_format).replace(tzinfo=pytz.UTC)
range_step = timedelta(seconds=SECONDS_IN_A_DAY)
expected = [
datetime.strptime('2018-02-26', datetime_format).replace(tzinfo=pytz.UTC),
datetime.strptime('2018-02-27', datetime_format).replace(tzinfo=pytz.UTC),
datetime.strptime('2018-02-28', datetime_format).replace(tzinfo=pytz.UTC),
datetime.strptime('2018-03-01', datetime_format).replace(tzinfo=pytz.UTC)
]
self.failUnless(expected == generate_range(range_start, range_stop, range_step))
def main():
unittest.main()
if __name__ == "__main__":
main()
@ouyi
Copy link
Author

ouyi commented Sep 4, 2018

Usage:

$ python daterange.py -a 2018-02-26 -o 2018-03-02 -f '%Y-%m-%d'
2018-02-26
2018-02-27
2018-02-28
2018-03-01

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment