[Pymoul-svn] SF.net SVN: pymoul: [160] pymoul/trunk/src/moul/time
Status: Alpha
Brought to you by:
tiran
|
From: <ti...@us...> - 2007-02-12 16:06:48
|
Revision: 160
http://pymoul.svn.sourceforge.net/pymoul/?rev=160&view=rev
Author: tiran
Date: 2007-02-12 08:06:42 -0800 (Mon, 12 Feb 2007)
Log Message:
-----------
Finished D'ni time calculation
Modified Paths:
--------------
pymoul/trunk/src/moul/time/dni.py
Added Paths:
-----------
pymoul/trunk/src/moul/time/utils.py
Modified: pymoul/trunk/src/moul/time/dni.py
===================================================================
--- pymoul/trunk/src/moul/time/dni.py 2007-02-12 13:36:09 UTC (rev 159)
+++ pymoul/trunk/src/moul/time/dni.py 2007-02-12 16:06:42 UTC (rev 160)
@@ -21,20 +21,43 @@
official sources say that:
00:00:00:00, Leefo 1, 9654 DE = 10:35:18 UTC, April 21, 1998 CE
+
>>> LEEFO_1_TABLE = [
-... datetime(1998, 4, 21, 10, 35, 18, 0, UTC),
-... datetime(1999, 4, 21, 16, 24, 3, 0, UTC),
-... datetime(2000, 4, 20, 22, 12, 48, 0, UTC),
-... datetime(2001, 4, 21, 4, 1, 33, 0, UTC),
-... datetime(2002, 4, 21, 9, 50, 18, 0, UTC),
-... datetime(2003, 4, 21, 15, 39, 3, 0, UTC),
+... datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC),
+... datetime(1999, 4, 21, 16, 24, 3, 0, tzinfo=UTC),
+... datetime(2000, 4, 20, 22, 12, 48, 0, tzinfo=UTC),
+... datetime(2001, 4, 21, 4, 1, 33, 0, tzinfo=UTC),
+... datetime(2002, 4, 21, 9, 50, 18, 0, tzinfo=UTC),
+... datetime(2003, 4, 21, 15, 39, 3, 0, tzinfo=UTC),
... ]
+>>> def compareDT(dt1, dt2):
+... delta = td2sec(dt1 - dt2)
+... # smaller than 5 seconds
+... if abs(delta) < 5:
+... return True
+... else:
+... return delta
+
>>> dni = DniTime()
>>> dni.fromUTC(LEEFO_1_TABLE[1])
>>> dni.get()
-(9655, 0, 0, 0, 0, 0, 0)
+(9655, 1, 1, 0, 0, 0, 0)
+>>> str(dni)
+'00:00:00:00, Leefo 1, 9655'
+>>> compareDT(dni.toUTC(), LEEFO_1_TABLE[1])
+True
+>>> other = datetime(2007, 2, 12, 13, 55, 10, 0, tzinfo=UTC)
+>>> dni.fromUTC(other)
+>>> dni.get()
+(9662, 9, 4, 4, 21, 24, 21)
+>>> str(dni)
+'04:21:24:21, Leevotar 4, 9662'
+
+>>> compareDT(dni.toUTC(), other)
+True
+
"""
__author__ = "Christian Heimes"
__version__ = "$Id$"
@@ -43,6 +66,7 @@
from datetime import datetime
from operator import mul
from pytz import utc as UTC
+from time import mktime
import sys
from moul.time.utils import td2sec
@@ -79,12 +103,16 @@
)
# 00:00:00:00, Leefo 1, 9654 DE
-BASE = datetime(1998, 4, 21, 10, 35, 18, 0, UTC)
+BASE = datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC)
+# timestamp 0 - start of unix time
+UNIX_0 = datetime(1970, 1, 1, 0, 0, 0, 0, tzinfo=UTC)
+BASE_SEC = td2sec(BASE-UNIX_0) # WTF? datetime has no totimestamp() method
BASE_HAHR = 9654
+BASE_YEAR = 1998
SECONDS_PER_HAHR = 31556925
PRORAHN_PER_HAHR = 22656250
-FACTOR_SH = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR)
-FACTOR_HS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR)
+FACTOR_SP = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR)
+FACTOR_PS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR)
def valueCheck(typ, minv, maxv):
"""Value and type checking decorator
@@ -157,14 +185,25 @@
if utc_dt is None:
utc_dt = utcnow()
sec = td2sec(utc_dt - BASE)
- prorahn = sec * FACTOR_HS
+ prorahn = int(sec * FACTOR_PS)
self.set(hahr=BASE_HAHR, prorahn=prorahn)
def toUTC(self):
"""Convert to UTC datetime value
"""
- raise NotImplementedError
+ hahr_sec = (self.hahr - BASE_HAHR) * SECONDS_PER_HAHR
+ prorahn_sec = int(self._prorahn * FACTOR_SP)
+ sec = hahr_sec + BASE_SEC + prorahn_sec
+ return UTC.localize(datetime.utcfromtimestamp(sec))
+ def __str__(self):
+ """00:00:00:00, Leefo 1, 9654
+ """
+ return ("%02i:%02i:%02i:%02i, %s %i, %i" % (
+ self.gahrtahvo, self.tahvo, self.gorahn, self.prorahn,
+ self.getVaileeName(), self.yahr, self.hahr
+ ))
+
def _getHahr(self):
return self._hahr
@valueCheck(int, 0, sys.maxint)
@@ -173,42 +212,42 @@
hahr = property(_getHahr, _setHahr)
def _getVailee(self):
- return self._prorahn // 2265625
+ return ((self._prorahn // 2265625) % 10) +1
@valueCheck(int, 0, 10)
def _setVailee(self, value):
self._addProrahn(value * 2265625)
vailee = property(_getVailee, _setVailee)
def getVaileeName(self):
- return VAILEETEE[self.vailee]
+ return VAILEETEE[self.vailee-1]
def _getYahr(self):
- return self._prorahn // 78125
+ return ((self._prorahn // 78125) % 29) +1
@valueCheck(int, 0, 29)
def _setYahr(self, value):
self._addProrahn(value * 78125)
yahr = property(_getYahr, _setYahr)
def _getBell(self):
- return self.gahrtahvo // 5
+ return (self.gahrtahvo // 5) % 25
bell = property(_getBell)
def _getGahrtahvo(self):
- return self._prorahn // 15625
+ return (self._prorahn // 15625) % 5
@valueCheck(int, 0, 5)
def _setGahrtahvo(self, value):
self._addProrahn(value * 15625)
gahrtahvo = property(_getGahrtahvo, _setGahrtahvo)
def _getTahvo(self):
- return self._prorahn // 625
+ return (self._prorahn // 625) % 25
@valueCheck(int, 0, 25)
def _setTahvo(self, value):
self._addProrahn(value * 625)
tahvo = property(_getTahvo, _setTahvo)
def _getGorahn(self):
- return self._prorahn // 25
+ return (self._prorahn // 25) % 25
@valueCheck(int, 0, 25)
def _setGorahn(self, value):
self._addProrahn(value * 25)
@@ -222,7 +261,9 @@
prorahn = property(_getProrahn, _setProrahn)
def _addProrahn(self, value):
- self._prorahn += int(value)
- addhahr = self._prorahn // PRORAHN_PER_HAHR
+ value = int(value)
+ addhahr = value // PRORAHN_PER_HAHR
if addhahr:
self._hahr += addhahr
+ value = value - (addhahr * PRORAHN_PER_HAHR)
+ self._prorahn = value
Added: pymoul/trunk/src/moul/time/utils.py
===================================================================
--- pymoul/trunk/src/moul/time/utils.py (rev 0)
+++ pymoul/trunk/src/moul/time/utils.py 2007-02-12 16:06:42 UTC (rev 160)
@@ -0,0 +1,74 @@
+# pyMoul - Python interface to Myst Online URU Live
+# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de>
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc., 59
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+"""pyMoul cavern time tool
+"""
+__author__ = "Christian Heimes"
+__version__ = "$Id: cavern.py 124 2007-02-02 17:45:42Z tiran $"
+__revision__ = "$Revision: 124 $"
+
+from datetime import datetime
+from pytz import utc as UTC
+
+
+def diffTD(td1, td2):
+ """Difference of two time delta objects -> int
+
+ >>> from datetime import timedelta
+ >>> type(diffTD(timedelta(0, 3600), timedelta(0, -3600)))
+ <type 'int'>
+ >>> diffTD(timedelta(0, 3600), timedelta(0, -3600))
+ 7200
+ >>> diffTD(timedelta(0, 3600), timedelta(0, 3600))
+ 0
+ >>> diffTD(timedelta(0, -3600), timedelta(0, -3600))
+ 0
+ >>> diffTD(timedelta(0, -7200), timedelta(0, -3600))
+ -3600
+ >>> diffTD(timedelta(0, -3600), timedelta(0, -7200))
+ 3600
+ >>> diffTD(timedelta(0, 3600, 1), timedelta(0, -3600))
+ Traceback (most recent call last):
+ ...
+ ValueError: Can't handle microseconds
+ """
+ if td1.microseconds or td2.microseconds:
+ raise ValueError("Can't handle microseconds")
+ return (td1.seconds + 86400 * td1.days) - (td2.seconds + 86400 * td2.days)
+
+def td2sec(td):
+ """timedelta to seconds
+
+ >>> from datetime import timedelta
+ >>> td2sec(timedelta(0, 3600))
+ 3600
+ >>> td2sec(timedelta(0, -3600))
+ -3600
+ """
+ return td.seconds + 86400 * td.days
+
+def utcnow():
+ """Get current time in UTC
+ """
+ return UTC.localize(datetime.utcnow())
+
+def normalizeTZ(tz, utc_dt=None):
+ """Normalize a datetime object with UTC tz using another tz
+ """
+ if utc_dt is None:
+ utc_dt = utcnow()
+ return tz.normalize(utc_dt.astimezone(tz))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|