Package Gnumed :: Package timelinelib :: Package calendar :: Package gregorian :: Module time |
[frames] | no frames]

# Source Code for Module Gnumed.timelinelib.calendar.gregorian.time

      1  # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018  Rickard Lindberg, Roger Lindberg
      2  #
      3  # This file is part of Timeline.
      4  #
      5  # Timeline is free software: you can redistribute it and/or modify
      6  # it under the terms of the GNU General Public License as published by
      7  # the Free Software Foundation, either version 3 of the License, or
      8  # (at your option) any later version.
      9  #
     10  # Timeline is distributed in the hope that it will be useful,
     11  # but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  # GNU General Public License for more details.
     14  #
     15  # You should have received a copy of the GNU General Public License
     16  # along with Timeline.  If not, see <http://www.gnu.org/licenses/>.
     17
     18
     19  from timelinelib.calendar.time import ComparableValue
     20  from timelinelib.calendar.time import GenericDeltaMixin
     21  from timelinelib.calendar.time import GenericTimeMixin
     22
     23
     24  SECONDS_IN_DAY = 24 * 60 * 60
     25
     26
     27 -class GregorianTime(GenericTimeMixin):
     28
     29      MIN_JULIAN_DAY = 0
     30
     31      @property
     32 -    def DeltaClass(self):
     33          return GregorianDelta
     34
     35      @classmethod
     36 -    def min(cls):
     37          return cls(cls.MIN_JULIAN_DAY, 0)
     38
     39      @classmethod
     40 -    def set_min_julian_day(cls, allow_negative_julian_yeras):
     41          if allow_negative_julian_yeras:
     42              cls.MIN_JULIAN_DAY = -1000000000000000000000000000000000000000000000000
     43          else:
     44              cls.MIN_JULIAN_DAY = 0
     45
     46 -    def __init__(self, julian_day, seconds):
     47          if julian_day < self.MIN_JULIAN_DAY:
     48              raise ValueError("julian_day must be >= %d" % self.MIN_JULIAN_DAY)
     49          if seconds < 0 or seconds >= SECONDS_IN_DAY:
     50              raise ValueError("seconds must be >= 0 and <= 24*60*60")
     51          self.julian_day = julian_day
     52          self.seconds = seconds
     53
     54 -    def __eq__(self, time):
     55          return (isinstance(time, self.__class__) and
     56                  self.julian_day == time.julian_day and
     57                  self.seconds == time.seconds)
     58
     59 -    def __ne__(self, time):
     60          return not (self == time)
     61
     62 -    def __add__(self, delta):
     63          if isinstance(delta, self.DeltaClass):
     64              seconds = self.seconds + delta.seconds
     65              return self.__class__(self.julian_day + seconds / SECONDS_IN_DAY, seconds % SECONDS_IN_DAY)
     66          raise TypeError(
     67              "%s + %s not supported" % (self.__class__.__name__, type(delta))
     68          )
     69
     70 -    def __sub__(self, other):
     71          if isinstance(other, self.DeltaClass):
     72              seconds = self.seconds - other.seconds
     73              if seconds < 0:
     74                  if seconds % SECONDS_IN_DAY == 0:
     75                      days = abs(seconds) / SECONDS_IN_DAY
     76                      seconds = 0
     77                  else:
     78                      days = abs(seconds) / SECONDS_IN_DAY + 1
     79                      seconds = SECONDS_IN_DAY - abs(seconds) % SECONDS_IN_DAY
     80                  return self.__class__(self.julian_day - days, seconds)
     81              else:
     82                  return self.__class__(self.julian_day, seconds)
     83          else:
     84              days_diff = self.julian_day - other.julian_day
     85              seconds_diff = self.seconds - other.seconds
     86              return self.DeltaClass(days_diff * SECONDS_IN_DAY + seconds_diff)
     87
     88 -    def __gt__(self, dt):
     89          return (self.julian_day, self.seconds) > (dt.julian_day, dt.seconds)
     90
     91 -    def __ge__(self, dt):
     92          return self == dt or self > dt
     93
     94 -    def __lt__(self, dt):
     95          return (self.julian_day, self.seconds) < (dt.julian_day, dt.seconds)
     96
     97 -    def __repr__(self):
     98          return "{0}({1!r}, {2!r})".format(
     99              self.__class__.__name__,
    100              self.julian_day,
    101              self.seconds
    102          )
    103
    104 -    def get_time_of_day(self):
    105          hours = self.seconds / 3600
    106          minutes = (self.seconds / 60) % 60
    107          seconds = self.seconds % 60
    108          return (hours, minutes, seconds)
    109
    110
    111 -class GregorianDelta(ComparableValue, GenericDeltaMixin):
    112
    113      @classmethod
    114 -    def from_seconds(cls, seconds):
    115          return cls(seconds)
    116
    117      @classmethod
    118 -    def from_days(cls, days):
    119          return cls(SECONDS_IN_DAY * days)
    120
    121      @property
    122 -    def seconds(self):
    123          return self.value
    124
    125 -    def __div__(self, value):
    126          if isinstance(value, self.__class__):
    127              return float(self.seconds) / float(value.seconds)
    128          else:
    129              return self.__class__(self.seconds / value)
    130
    131 -    def __sub__(self, delta):
    132          return self.__class__(self.seconds - delta.seconds)
    133
    134 -    def __mul__(self, value):
    135          return self.__class__(int(self.seconds * value))
    136
    137 -    def get_days(self):
    138          return self.seconds / SECONDS_IN_DAY
    139
    140 -    def get_hours(self):
    141          return (self.seconds / (60 * 60)) % 24
    142
    143 -    def get_minutes(self):
    144          return (self.seconds / 60) % 60
    145
    146 -    def __repr__(self):
    147          return "{0}({1!r})".format(
    148              self.__class__.__name__,
    149              self.seconds
    150          )
    151