parent
10ee70427c
commit
9a4f4d782b
2 changed files with 157 additions and 0 deletions
@ -0,0 +1,54 @@ |
|||||||
|
""" |
||||||
|
Test routines for wpylib.datetime module (and related submodules). |
||||||
|
""" |
||||||
|
|
||||||
|
from time import localtime, gmtime, strftime |
||||||
|
|
||||||
|
from wpylib.datetime0_idt import idatetime |
||||||
|
from wpylib.datetime import utime_to_iso |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def test_idt_01(): |
||||||
|
"""[20141016] |
||||||
|
Basic idatetime tests. |
||||||
|
""" |
||||||
|
iidt = 20141201083724315 |
||||||
|
idt = idatetime(iidt) |
||||||
|
print "integer value = %+18d" % idt.idt |
||||||
|
print "iso8601 format = %s" % idt.str_iso8601() |
||||||
|
|
||||||
|
|
||||||
|
def test_u2i_01(): |
||||||
|
"""[20141016] |
||||||
|
Testing utime_to_iso subroutine. |
||||||
|
|
||||||
|
Output: |
||||||
|
|
||||||
|
unix time = 1413475094.058478 |
||||||
|
time interpretation (local) = Thu Oct 16 11:58:14 EDT 2014 |
||||||
|
utime_to_iso output (local) = 2014-10-16 11:58:14 -04:00 |
||||||
|
utime_to_iso output (local/iso8601) = 2014-10-16T11:58:14.058478116-04:00 |
||||||
|
time interpretation (utc) = Thu Oct 16 15:58:14 EST 2014 |
||||||
|
utime_to_iso output (utc) = 2014-10-16 15:58:14 +00:00 |
||||||
|
utime_to_iso output (utc/iso8601) = 2014-10-16T15:58:14.058478116Z |
||||||
|
utime_to_iso output (utc/idtstamp) = 2014-10-16T15:58:14.058 |
||||||
|
|
||||||
|
""" |
||||||
|
unix_time = 1413475094.058478 |
||||||
|
str_time = utime_to_iso(unix_time, local=True) |
||||||
|
str_gmtime = utime_to_iso(unix_time, local=False) |
||||||
|
print "unix time = ", "%.16g" % unix_time |
||||||
|
|
||||||
|
print "time interpretation (local) = ", strftime("%a %b %e %H:%M:%S %Z %Y", localtime(unix_time)) |
||||||
|
print "utime_to_iso output (local) = ", str_time |
||||||
|
print "utime_to_iso output (local/iso8601) = ", utime_to_iso(unix_time, local=True, fmt='iso8601') |
||||||
|
|
||||||
|
print "time interpretation (utc) = ", strftime("%a %b %e %H:%M:%S %Z %Y", gmtime(unix_time)) |
||||||
|
print "utime_to_iso output (utc) = ", str_gmtime |
||||||
|
print "utime_to_iso output (utc/iso8601) = ", utime_to_iso(unix_time, local=False, fmt='iso8601') |
||||||
|
print "utime_to_iso output (utc/idtstamp) = ", utime_to_iso(unix_time, local=False, fmt='idtstamp') |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,103 @@ |
|||||||
|
# |
||||||
|
# wpylib.datetime0_idt |
||||||
|
# Created: 20141015 |
||||||
|
# Wirawan Purwanto |
||||||
|
# |
||||||
|
# Simple date/time stamp using 64-bit integer. |
||||||
|
# This module is an internal module; the exported name will |
||||||
|
# be put in wpylib.datetime module. |
||||||
|
# |
||||||
|
|
||||||
|
""" |
||||||
|
wplib.datetime0_idt module |
||||||
|
|
||||||
|
Simple date/time stamp using 64-bit integer. |
||||||
|
The primary motivation of creating this class is to store date/time |
||||||
|
information in the most compact way, while keeping the ease of |
||||||
|
human readability. |
||||||
|
|
||||||
|
The internal format is very simple: |
||||||
|
|
||||||
|
YYYYMMDDhhmmssfff |
||||||
|
|
||||||
|
where: |
||||||
|
- YYYY = year (0 < YYYY <= 9999) |
||||||
|
- MM = month (1 <= MM <= 12) |
||||||
|
- DD = day |
||||||
|
- hh = hour (0 <= hh < 24) |
||||||
|
- mm = minutes |
||||||
|
- ss = seconds |
||||||
|
- fff = milliseconds |
||||||
|
|
||||||
|
The time is always expressed in terms of UTC to eliminate ambiguity of |
||||||
|
time zone, daylight savings time, etc. |
||||||
|
CAVEAT: The resolution of the time is only on the order of millisecond. |
||||||
|
|
||||||
|
This is a 17-decimal-digit integer, which fits in a 64-bit range (9.22e+18). |
||||||
|
|
||||||
|
""" |
||||||
|
|
||||||
|
from wpylib.params import struct |
||||||
|
|
||||||
|
|
||||||
|
class idatetime(object): |
||||||
|
"""Simple 8-byte integer representation of a date/time stamp. |
||||||
|
""" |
||||||
|
def __init__(self, idt=None): |
||||||
|
if idt != None: |
||||||
|
self.idt = idt |
||||||
|
|
||||||
|
def validate(self): |
||||||
|
raise NotImplementedError |
||||||
|
|
||||||
|
def split_values(self): |
||||||
|
"""Splits the compact datetime into components. |
||||||
|
Warning: the values are NOT validated. |
||||||
|
""" |
||||||
|
idt = self.idt |
||||||
|
s = str(idt) |
||||||
|
R = struct() |
||||||
|
#R.YYYY, R.MM, R.DD, R.hh, R.mm, R.ss, R.fff # names are too cryptic |
||||||
|
# Use same member names as in datetime (in sofar it is possible): |
||||||
|
R.year, R.month, R.day, R.hour, R.minute, R.second, R.millisecond = map(int, [ |
||||||
|
s[:-13], # year |
||||||
|
s[-13:-11], # month |
||||||
|
s[-11:-9], # day |
||||||
|
s[-9:-7], # hour |
||||||
|
s[-7:-5], # min |
||||||
|
s[-5:-3], # sec |
||||||
|
s[-3:] # millisec |
||||||
|
]) |
||||||
|
R.microsecond = R.millisecond * 1000 |
||||||
|
return R |
||||||
|
|
||||||
|
def to_datetime(self): |
||||||
|
"""Converts the object value to standard python datetime object. |
||||||
|
""" |
||||||
|
from datetime import datetime |
||||||
|
R = self.split_values() |
||||||
|
dt = datetime(R.year, R.month, R.day, R.hour, R.minute, R.second, R.microsecond) |
||||||
|
''' |
||||||
|
idt = self.idt |
||||||
|
s = str(idt) |
||||||
|
YYYY, MM, DD, hh, mm, ss, ms = map(int, [ |
||||||
|
s[:-13], # year |
||||||
|
s[-13:-11], # month |
||||||
|
s[-11:-9], # day |
||||||
|
s[-9:-7], # hour |
||||||
|
s[-7:-5], # min |
||||||
|
s[-5:-3], # sec |
||||||
|
s[-3:] # millisec |
||||||
|
]) |
||||||
|
dt = datetime(YYYY, MM, DD, hh, mm, ss, fff*1000) |
||||||
|
''' |
||||||
|
return dt |
||||||
|
|
||||||
|
def str_iso8601(self): |
||||||
|
"""Outputs the object according to ISO-8601 combined date/time format. |
||||||
|
No time zone is shown.""" |
||||||
|
R = self.split_values() |
||||||
|
fmt = "%(year)04d-%(month)02d-%(day)02dT%(hour)02d:%(minute)02d:%(second)02d.%(millisecond)03d" |
||||||
|
return fmt % R |
||||||
|
|
||||||
|
|
Loading…
Reference in new issue