Source code for rattail.time

# -*- coding: utf-8 -*-
################################################################################
#
#  Rattail -- Retail Software Framework
#  Copyright © 2010-2015 Lance Edgar
#
#  This file is part of Rattail.
#
#  Rattail is free software: you can redistribute it and/or modify it under the
#  terms of the GNU Affero General Public License as published by the Free
#  Software Foundation, either version 3 of the License, or (at your option)
#  any later version.
#
#  Rattail 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 Affero General Public License for
#  more details.
#
#  You should have received a copy of the GNU Affero General Public License
#  along with Rattail.  If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Time Utilities
"""

from __future__ import unicode_literals

import datetime
import warnings

import pytz


[docs]def localtime(config, time=None, key='default', tzinfo=True): """ Return a datetime which has been localized to a particular timezone. The :func:`timezone()` function will be used to obtain the timezone to which the time value will be localized. :param config: Reference to a config object. :param time: Optional :class:`python:datetime.datetime` instance to be localized. If not provided, the current time ("now") is assumed. :param tzinfo: Boolean indicating whether the result should contain ``tzinfo`` or not, i.e. whether it should be time zone "aware" (``True``) or "naive" (``False``). :param key: Config key to be used in determining to which timezone the time should be localized. """ zone = timezone(config, key) if time is None: time = datetime.datetime.utcnow() time = pytz.utc.localize(time) time = zone.normalize(time.astimezone(zone)) elif time.tzinfo: time = zone.normalize(time.astimezone(zone)) else: time = zone.localize(time) if not tzinfo: time = time.replace(tzinfo=None) return time
[docs]def timezone(config, key='default'): """ Return a timezone object based on the definition found in config. :param config: Reference to a config object. :param key: Config key used to determine which timezone should be returned. :returns: A :class:`pytz:pytz.tzinfo` instance, created using the Olson time zone name found in the config file. An example of the configuration syntax which is assumed by this function: .. code-block:: ini [rattail] # retrieve with: timezone(config) timezone.default = America/Los_Angeles # retrieve with: timezone(config, 'headoffice') timezone.headoffice = America/Chicago # retrieve with: timezone(config, 'satellite') timezone.satellite = America/New_York See `Wikipedia`_ for the full list of Olson time zone names. .. _`Wikipedia`: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones """ # Don't *require* the correct config option just yet, so we can fall back # to 'local' for default if necessary. zone = config.get('rattail', 'timezone.{0}'.format(key)) if zone is None and key == 'default': zone = config.get('rattail', 'timezone.local') if zone is None: # Okay, now let's require the correct one. zone = config.require('rattail', 'timezone.{0}'.format(key)) return pytz.timezone(zone)
[docs]def make_utc(time): """ Convert a timezone-aware time back to a naive UTC equivalent. """ utctime = pytz.utc.normalize(time.astimezone(pytz.utc)) return utctime.replace(tzinfo=None)