--- /dev/null
+#!/usr/bin/python3
+
+import sys
+import time
+import datetime
+
+units = {"s" : 1, "m" : 60, "h" : 60*60, "d" : 24*60*69 }
+
+def reprint(value, file=sys.stdout, end=""):
+ print("\r" + value, file=file, end=end)
+
+
+def usage():
+ print("""Usage: {0} [--reverse] [--offset <time>] [--update <time>] [--round <int>]
+ {0} -h
+ {0} --help
+
+Options:
+ --reverse count backwards
+ --offset <time> start counting from specified offset
+ --update <time> interval between two screen updates
+ --round <int> round seconds by specified number of digits
+
+<time> is an integer specifing the number of seconds or a string
+of the format "<int>(Undefined, Undefined, Undefined, Undefined)" with the suffixes d(ay), h(our),
+m(inute), s(econd).
+""".format(sys.argv[0]))
+
+def parseTime(value):
+
+ factor = 1
+
+ if value[-1] in units:
+ factor = units[value[-1]]
+ value = value[:-1]
+
+ return float(value)*factor
+
+
+def formatTime(secs, digits=0):
+
+ sign = ""
+ if secs < 0:
+ sign = "-"
+ secs = -secs
+
+ days = int(secs/units["d"])
+ secs -= days * units["d"]
+
+ hours = int(secs/units["h"])
+ secs -= hours * units["h"]
+
+ mins = int(secs/units["m"])
+ secs -= mins * units["m"]
+
+ s = "%.{0}f".format(digits) % (round(secs, digits) ) + "s"
+ if days>0:
+ s = " %dd %dh %dm %s" %(days, hours, mins, s)
+ elif hours>0:
+ s = " %dh %dm %s" %(hours, mins, s)
+ elif mins>0:
+ s = " %dm %s" %(mins, s)
+
+ s = sign + s
+ return s
+
+
+def parseArgs():
+ opts = {"help" : False, "reverse" : False, "offset" : 0.0, "update" : 1,
+ "round" : 0}
+ i=1
+ while i<len(sys.argv):
+
+ if sys.argv[i] in ["-h", "--help"]:
+ opts["help"] = True
+ elif sys.argv[i] in ["--reverse"]:
+ opts["reverse"] = True
+ elif sys.argv[i] in ["--offset"]:
+ i = i+1
+ opts["offset"] = parseTime(sys.argv[i])
+ elif sys.argv[i] in ["--update"]:
+ i = i+1
+ opts["update"] = parseTime(sys.argv[i])
+ elif sys.argv[i] in ["--round"]:
+ i = i+1
+ opts["round"] = int(sys.argv[i])
+ else:
+ raise "Unknown option '{0}'".format(sys.argv[i])
+
+ i = i+1
+ return opts
+
+
+if __name__ == "__main__":
+
+ opts = parseArgs()
+
+ if opts["help"]:
+ usage()
+ sys.exit(0)
+
+ start=time.time()
+
+ print("started at " + str(datetime.datetime.now()))
+
+ while True:
+
+ diff=time.time()-start
+ if opts["reverse"]:
+ diff = -diff
+ diff += opts["offset"]
+
+ reprint(formatTime(diff, opts["round"]) + " ")
+ time.sleep(opts["update"])
+
+
+
+