EQGRP/Linux/etc/cdate.py
2017-04-08 16:05:14 +02:00

192 lines
6 KiB
Python
Executable file

#!/usr/bin/env python
version = "3.0.0.0"
import sys
import time
import os
import re
import getopt
import calendar
def usage(prog):
prog = prog.split(os.sep)[-1]
print 'usage: %s [options] [date [+/-hr]]\n' % (prog)
print 'options:'
print ' -e show epoch seconds'
print ' -d show YYYYMMDDHHMM.SS format'
print ' -u show MM/DD HH:MM (sulog) format'
print ' -s show string format\n'
print ' -h show help and exit'
print ' -v show version and exit\n'
print 'date can be in the following formats:\n'
print ' epoch in secs ex. 1000000000'
print ' YYYYMMDDHHMM[.SS] ex. 200109090146.40'
print ' MM/DD HH:MM [YYYY] ex. 09/09 01:46 2001'
print ' [Ddd] Mmm DD HH:MM[:SS] [YYYY] ex. Sun Sep 09 01:46:40 2001\n'
print '+/-hr specifies an offset in hours, ex. +8\n'
print '%s version %s' % (os.path.basename(prog), version)
sys.exit(1)
def to_epoch(t):
return str(calendar.timegm(t))
def to_date(t):
return time.strftime('%Y%m%d%H%M.%S', t)
def to_str(t):
return time.strftime('%b %d %H:%M:%S %Y', t)
def to_sulog(t):
return time.strftime('%m/%d %H:%M %Y', t)
def parse_str(s):
try:
if re.match('^\d{1,10}$', s):
thedate = time.gmtime(int(s))
elif re.match('^\d{12}$', s):
thedate = time.strptime(s, '%Y%m%d%H%M')
elif re.match('^\d{12}\.\d\d$', s):
thedate = time.strptime(s, '%Y%m%d%H%M.%S')
elif re.match('^\w{3} \d{1,2} \d\d:\d\d:\d\d \d{4}$', s): # Mmm DD HH:HH:SS YYYY
thedate = time.strptime(s, '%b %d %H:%M:%S %Y')
elif re.match('^\w{3} \d{1,2} \d\d:\d\d \d{4}$', s): # Mmm DD HH:HH YYYY
thedate = time.strptime(s, '%b %d %H:%M %Y')
elif re.match('^\w{3} \d{1,2} \d\d:\d\d:\d\d$', s): # Mmm DD HH:HH:SS
thedate = time.strptime(s + ' %d' % (time.localtime()[0]), '%b %d %H:%M:%S %Y')
elif re.match('^\w{3} \d{1,2} \d\d:\d\d$', s): # Mmm DD HH:HH
thedate = time.strptime(s + ' %d' % (time.localtime()[0]), '%b %d %H:%M %Y')
elif re.match('^\w{3} \w{3} \d{1,2} \d\d:\d\d:\d\d \d{4}$', s): # Ddd Mmm DD HH:HH:SS YYYY
thedate = time.strptime(s, '%a %b %d %H:%M:%S %Y')
elif re.match('^\w{3} \w{3} \d{1,2} \d\d:\d\d \d{4}$', s): # Ddd Mmm DD HH:HH YYYY
thedate = time.strptime(s, '%a %b %d %H:%M %Y')
elif re.match('^\w{3} \w{3} \d{1,2} \d\d:\d\d:\d\d$', s): # Ddd Mmm DD HH:HH:SS
thedate = time.strptime(s + ' %d' % (time.localtime()[0]), '%a %b %d %H:%M:%S %Y')
elif re.match('^\w{3} \w{3} \d{1,2} \d\d:\d\d$', s): # Ddd Mmm DD HH:HH
thedate = time.strptime(s + ' %d' % (time.localtime()[0]), '%a %b %d %H:%M %Y')
elif re.match('^\d\d\/\d\d \d\d:\d\d$', s): # MM/DD HH:MM
thedate = time.strptime(s + ' %d' % (time.localtime()[0]), '%m/%d %H:%M %Y')
elif re.match('^\d\d\/\d\d \d\d:\d\d \d\d\d\d$', s): # MM/DD HH:MM YYYY
thedate = time.strptime(s, '%m/%d %H:%M %Y')
else:
return None
except Exception, e:
print str(e)
return None
return thedate
def print_pretty(t):
print ''
print 'epoch time : %s' % (t[0])
print 'YYYYMMDDHHMM.SS : %s' % (t[1])
print 'MM/DD HH:MM YYYY : %s' % (t[2])
print 'full string : %s' % (t[3])
print ''
def convert(args):
thedate = None
thedate_woff = None # The date shifted for proper epoch time done by tzoffset
offset = 0 # To arbitrarily shift all timestamps
tzoffset = 0 # To set the offset for timezones, properly computing epoch time
if args == None or len(args) == 0:
thedate = time.localtime()
else:
if len(args[-1]) == 1: # Looks like we were handed a string, so going to do a split here
args = args.split()
if re.match('^[+-]\d\d?$', args[-1]):
offset = int(args[-1])
if offset < -23 or offset > 23:
print 'error: bad offset value'
usage(sys.argv[0])
args = args[:-1]
if re.match('^[+-]\d\d\d\d$', args[-1]):
tzoffset = int(args[-1])/100.0 + (0-int(args[-1])/100.0) % 1 - (abs(int(args[-1])) % 100.0)/60.0
if tzoffset < -23 or tzoffset > 23:
print 'error: bad offset value'
usage(sys.argv[0])
args = args[:-1]
thedate = parse_str(' '.join(args))
if thedate == None:
print 'error: bad date format'
usage(sys.argv[0])
if tzoffset:
t = calendar.timegm(thedate)
t -= (tzoffset * 60 * 60)
thedate_woff = time.gmtime(t)
return to_epoch(thedate_woff), to_date(thedate), to_sulog(thedate), to_str(thedate)
if offset:
t = calendar.timegm(thedate)
t += (offset * 60 * 60)
thedate = time.gmtime(t)
return to_epoch(thedate), to_date(thedate), to_sulog(thedate), to_str(thedate)
def main():
showe = False
showd = False
shows = False
showu = False
if len(sys.argv) == 1:
thedates = convert(None)
print_pretty(thedates)
sys.exit(1)
try:
opts, args = getopt.getopt(sys.argv[1:], 'hvedsu')
except getopt.GetoptError, err:
print str(err)
usage(sys.argv[0])
for o, a in opts:
if o == '-h':
usage(sys.argv[0])
elif o == '-v':
print '%s version %s' % (os.path.basename(sys.argv[0]), version)
sys.exit(1)
elif o == '-e':
showe = True
elif o == '-d':
showd = True
elif o == '-s':
shows = True
elif o == '-u':
showu = True
thedates = convert(args)
if showe or showd or shows or showu:
if showe:
print thedates[0]
if showd:
print thedates[1]
if showu:
print thedates[2]
if shows:
print thedates[3]
else:
print_pretty(thedates)
if __name__ == '__main__':
main()