diff --git a/gracedb/models.py b/gracedb/models.py index 7a326d2a844f02661b5f3d7e799f9aae4cfdb9b6..d1fb6a928bff248a6c8e5c89ece86e2585c0a90d 100644 --- a/gracedb/models.py +++ b/gracedb/models.py @@ -6,7 +6,7 @@ import os from gracedb.ligolw.models import CoincEvent -from gracedb.gracedb.templatetags.timeutil import posixToGpsTime +from gracedb.utils import posixToGpsTime from django.conf import settings import pytz, time diff --git a/gracedb/templatetags/timeutil.py b/gracedb/templatetags/timeutil.py index 0d7ed89c23afce63741a62028adc8a6f1f261427..faa1a8ce246ba55a49df55a8ab69c36428ca5207 100644 --- a/gracedb/templatetags/timeutil.py +++ b/gracedb/templatetags/timeutil.py @@ -6,6 +6,7 @@ from django.utils import dateformat from django.utils.html import conditional_escape from django.utils.safestring import mark_safe +from gracedb.utils import posixToGpsTime, gpsToUtc import pytz import time @@ -114,55 +115,3 @@ def utc(dt, format=FORMAT): def gpsdate(gpstime, format=FORMAT): return dateformat.format(gpsToUtc(gpstime), format) - -# TAG that generates stuff that changes time display what-nots. - - -# GPS time conversion - -# This is kind of awful in that leapSeconds -# are hard coded and needs to be kept up to date. -# Also, this should be somewhere else. -# Also, there are almost certainly failing edge cases at leap second adjustment times. - -import calendar, datetime - -gpsEpoch = calendar.timegm((1980, 1, 6, 0, 0, 0, 0, 0, 0)) - -leapSeconds = map(calendar.timegm, [ - (1981, 7, 0, 0, 0, 0, 0, 0, 0), - (1982, 7, 0, 0, 0, 0, 0, 0, 0), - (1983, 7, 0, 0, 0, 0, 0, 0, 0), - (1985, 7, 0, 0, 0, 0, 0, 0, 0), - (1988, 1, 0, 0, 0, 0, 0, 0, 0), - (1990, 1, 0, 0, 0, 0, 0, 0, 0), - (1991, 1, 0, 0, 0, 0, 0, 0, 0), - (1992, 7, 0, 0, 0, 0, 0, 0, 0), - (1993, 7, 0, 0, 0, 0, 0, 0, 0), - (1994, 7, 0, 0, 0, 0, 0, 0, 0), - (1996, 1, 0, 0, 0, 0, 0, 0, 0), - (1997, 7, 0, 0, 0, 0, 0, 0, 0), - (1999, 1, 0, 0, 0, 0, 0, 0, 0), - (2006, 1, 0, 0, 0, 0, 0, 0, 0), - (2009, 1, 0, 0, 0, 0, 0, 0, 0), -]) - -def gpsToPosixTime(gpsTime): - t = gpsEpoch + gpsTime - for leap in leapSeconds: - if t >= leap: - t = t - 1 - return t - -def posixToGpsTime(posixTime): - change = 0 - for leap in leapSeconds: - if posixTime > leap: - change += 1 - return posixTime + change - gpsEpoch - -def gpsToUtc(gpsTime): - t = gpsToPosixTime(gpsTime) - return datetime.datetime.fromtimestamp(t, pytz.utc) - - diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..df4443682ffd88e45628cce3be6cd201616d11dd --- /dev/null +++ b/utils/__init__.py @@ -0,0 +1,53 @@ + +# GPS time conversion + +# This is kind of awful in that leapSeconds +# are hard coded and needs to be kept up to date. +# Also, this probably is/will be/should be in glue. +# Also, there are almost certainly failing edge cases at leap second adjustment times. +# Oh yea, and I don't think this works exactly right for some periods 2006-2008, say. + +import pytz +import datetime + +import calendar + +gpsEpoch = calendar.timegm((1980, 1, 6, 0, 0, 0, 0, 0, 0)) + +leapSeconds = map(calendar.timegm, [ + (1981, 7, 0, 0, 0, 0, 0, 0, 0), + (1982, 7, 0, 0, 0, 0, 0, 0, 0), + (1983, 7, 0, 0, 0, 0, 0, 0, 0), + (1985, 7, 0, 0, 0, 0, 0, 0, 0), + (1988, 1, 0, 0, 0, 0, 0, 0, 0), + (1990, 1, 0, 0, 0, 0, 0, 0, 0), + (1991, 1, 0, 0, 0, 0, 0, 0, 0), + (1992, 7, 0, 0, 0, 0, 0, 0, 0), + (1993, 7, 0, 0, 0, 0, 0, 0, 0), + (1994, 7, 0, 0, 0, 0, 0, 0, 0), + (1996, 1, 0, 0, 0, 0, 0, 0, 0), + (1997, 7, 0, 0, 0, 0, 0, 0, 0), + (1999, 1, 0, 0, 0, 0, 0, 0, 0), + (2006, 1, 0, 0, 0, 0, 0, 0, 0), + (2009, 1, 0, 0, 0, 0, 0, 0, 0), +]) + +def gpsToPosixTime(gpsTime): + t = gpsEpoch + gpsTime + for leap in leapSeconds: + if t >= leap: + t = t - 1 + return t + +def posixToGpsTime(posixTime): + change = 0 + for leap in leapSeconds: + if posixTime > leap: + change += 1 + return posixTime + change - gpsEpoch + +def gpsToUtc(gpsTime): + t = gpsToPosixTime(gpsTime) + return datetime.datetime.fromtimestamp(t, pytz.utc) + +