192 lines
6 KiB
Python
Executable file
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()
|