remove reliance on TZ= timezone setting
This commit is contained in:
parent
44deb957a6
commit
95a30012c0
5 changed files with 301 additions and 38 deletions
171
LICENSES/Python-2.0.txt
Normal file
171
LICENSES/Python-2.0.txt
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
|
||||
|
||||
1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"),
|
||||
and the Individual or Organization ("Licensee") accessing and otherwise using
|
||||
this software ("Python") in source or binary form and its associated documentation.
|
||||
|
||||
2. Subject to the terms and conditions of this License Agreement, PSF hereby
|
||||
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
|
||||
analyze, test, perform and/or display publicly, prepare derivative works,
|
||||
distribute, and otherwise use Python alone or in any derivative version, provided,
|
||||
however, that PSF's License Agreement and PSF's notice of copyright, i.e.,
|
||||
"Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation;
|
||||
All Rights Reserved" are retained in Python alone or in any derivative version
|
||||
prepared by Licensee.
|
||||
|
||||
3. In the event Licensee prepares a derivative work that is based on or incorporates
|
||||
Python or any part thereof, and wants to make the derivative work available
|
||||
to others as provided herein, then Licensee hereby agrees to include in any
|
||||
such work a brief summary of the changes made to Python.
|
||||
|
||||
4. PSF is making Python available to Licensee on an "AS IS" basis. PSF MAKES
|
||||
NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT
|
||||
NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY
|
||||
OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF
|
||||
PYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
|
||||
|
||||
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON FOR ANY
|
||||
INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING,
|
||||
DISTRIBUTING, OR OTHERWISE USING PYTHON, OR ANY DERIVATIVE THEREOF, EVEN IF
|
||||
ADVISED OF THE POSSIBILITY THEREOF.
|
||||
|
||||
6. This License Agreement will automatically terminate upon a material breach
|
||||
of its terms and conditions.
|
||||
|
||||
7. Nothing in this License Agreement shall be deemed to create any relationship
|
||||
of agency, partnership, or joint venture between PSF and Licensee. This License
|
||||
Agreement does not grant permission to use PSF trademarks or trade name in
|
||||
a trademark sense to endorse or promote products or services of Licensee,
|
||||
or any third party.
|
||||
|
||||
8. By copying, installing or otherwise using Python, Licensee agrees to be
|
||||
bound by the terms and conditions of this License Agreement.
|
||||
|
||||
|
||||
BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
|
||||
|
||||
BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
|
||||
|
||||
1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office
|
||||
at 160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization
|
||||
("Licensee") accessing and otherwise using this software in source or binary
|
||||
form and its associated documentation ("the Software").
|
||||
|
||||
2. Subject to the terms and conditions of this BeOpen Python License Agreement,
|
||||
BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license
|
||||
to reproduce, analyze, test, perform and/or display publicly, prepare derivative
|
||||
works, distribute, and otherwise use the Software alone or in any derivative
|
||||
version, provided, however, that the BeOpen Python License is retained in
|
||||
the Software, alone or in any derivative version prepared by Licensee.
|
||||
|
||||
3. BeOpen is making the Software available to Licensee on an "AS IS" basis.
|
||||
BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY
|
||||
OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION
|
||||
OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
|
||||
THE USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
|
||||
|
||||
4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE
|
||||
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT
|
||||
OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF,
|
||||
EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
||||
|
||||
5. This License Agreement will automatically terminate upon a material breach
|
||||
of its terms and conditions.
|
||||
|
||||
6. This License Agreement shall be governed by and interpreted in all respects
|
||||
by the law of the State of California, excluding conflict of law provisions.
|
||||
Nothing in this License Agreement shall be deemed to create any relationship
|
||||
of agency, partnership, or joint venture between BeOpen and Licensee. This
|
||||
License Agreement does not grant permission to use BeOpen trademarks or trade
|
||||
names in a trademark sense to endorse or promote products or services of Licensee,
|
||||
or any third party. As an exception, the "BeOpen Python" logos available at
|
||||
http://www.pythonlabs.com/logos.html may be used according to the permissions
|
||||
granted on that web page.
|
||||
|
||||
7. By copying, installing or otherwise using the software, Licensee agrees
|
||||
to be bound by the terms and conditions of this License Agreement.
|
||||
|
||||
|
||||
CNRI OPEN SOURCE LICENSE AGREEMENT (for Python 1.6b1)
|
||||
|
||||
IMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY.
|
||||
|
||||
BY CLICKING ON "ACCEPT" WHERE INDICATED BELOW, OR BY COPYING, INSTALLING OR
|
||||
OTHERWISE USING PYTHON 1.6, beta 1 SOFTWARE, YOU ARE DEEMED TO HAVE AGREED
|
||||
TO THE TERMS AND CONDITIONS OF THIS LICENSE AGREEMENT.
|
||||
|
||||
1. This LICENSE AGREEMENT is between the Corporation for National Research
|
||||
Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191
|
||||
("CNRI"), and the Individual or Organization ("Licensee") accessing and otherwise
|
||||
using Python 1.6, beta 1 software in source or binary form and its associated
|
||||
documentation, as released at the www.python.org Internet site on August 4,
|
||||
2000 ("Python 1.6b1").
|
||||
|
||||
2. Subject to the terms and conditions of this License Agreement, CNRI hereby
|
||||
grants Licensee a non-exclusive, royalty-free, world-wide license to reproduce,
|
||||
analyze, test, perform and/or display publicly, prepare derivative works,
|
||||
distribute, and otherwise use Python 1.6b1 alone or in any derivative version,
|
||||
provided, however, that CNRIs License Agreement is retained in Python 1.6b1,
|
||||
alone or in any derivative version prepared by Licensee.
|
||||
|
||||
Alternately, in lieu of CNRIs License Agreement, Licensee may substitute the
|
||||
following text (omitting the quotes): "Python 1.6, beta 1, is made available
|
||||
subject to the terms and conditions in CNRIs License Agreement. This Agreement
|
||||
may be located on the Internet using the following unique, persistent identifier
|
||||
(known as a handle): 1895.22/1011. This Agreement may also be obtained from
|
||||
a proxy server on the Internet using the URL:http://hdl.handle.net/1895.22/1011".
|
||||
|
||||
3. In the event Licensee prepares a derivative work that is based on or incorporates
|
||||
Python 1.6b1 or any part thereof, and wants to make the derivative work available
|
||||
to the public as provided herein, then Licensee hereby agrees to indicate
|
||||
in any such work the nature of the modifications made to Python 1.6b1.
|
||||
|
||||
4. CNRI is making Python 1.6b1 available to Licensee on an "AS IS" basis.
|
||||
CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF
|
||||
EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION
|
||||
OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
|
||||
THE USE OF PYTHON 1.6b1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
|
||||
|
||||
5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE
|
||||
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT
|
||||
OF USING, MODIFYING OR DISTRIBUTING PYTHON 1.6b1, OR ANY DERIVATIVE THEREOF,
|
||||
EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
|
||||
|
||||
6. This License Agreement will automatically terminate upon a material breach
|
||||
of its terms and conditions.
|
||||
|
||||
7. This License Agreement shall be governed by and interpreted in all respects
|
||||
by the law of the State of Virginia, excluding conflict of law provisions.
|
||||
Nothing in this License Agreement shall be deemed to create any relationship
|
||||
of agency, partnership, or joint venture between CNRI and Licensee. This License
|
||||
Agreement does not grant permission to use CNRI trademarks or trade name in
|
||||
a trademark sense to endorse or promote products or services of Licensee,
|
||||
or any third party.
|
||||
|
||||
8. By clicking on the "ACCEPT" button where indicated, or by copying, installing
|
||||
or otherwise using Python 1.6b1, Licensee agrees to be bound by the terms
|
||||
and conditions of this License Agreement.
|
||||
|
||||
ACCEPT
|
||||
|
||||
|
||||
CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
|
||||
|
||||
Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands.
|
||||
All rights reserved.
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its documentation
|
||||
for any purpose and without fee is hereby granted, provided that the above
|
||||
copyright notice appear in all copies and that both that copyright notice
|
||||
and this permission notice appear in supporting documentation, and that the
|
||||
name of Stichting Mathematisch Centrum or CWI not be used in advertising or
|
||||
publicity pertaining to distribution of the software without specific, written
|
||||
prior permission.
|
||||
|
||||
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
|
||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
|
||||
IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL,
|
||||
INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
|
||||
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
14
testpm.py
14
testpm.py
|
|
@ -12,20 +12,6 @@ import time
|
|||
|
||||
|
||||
class TestPhaseModulation(unittest.TestCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls._old_tz = os.environ.get("TZ")
|
||||
os.environ["TZ"] = ":America/Denver" # Home of WWVB
|
||||
time.tzset()
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
if cls._old_tz is None:
|
||||
del os.environ["TZ"]
|
||||
else:
|
||||
os.environ["TZ"] = cls._old_tz
|
||||
time.tzset()
|
||||
|
||||
def test_pm(self):
|
||||
|
||||
ref_am = (
|
||||
|
|
|
|||
20
testwwvb.py
20
testwwvb.py
|
|
@ -16,26 +16,6 @@ import os
|
|||
import io
|
||||
|
||||
|
||||
old_tz = None
|
||||
|
||||
|
||||
# It's impotant that the tests run in this time zone because information about
|
||||
# DST rules comes from it.
|
||||
def setUpModule():
|
||||
global old_tz
|
||||
old_tz = os.environ.get("TZ")
|
||||
os.environ["TZ"] = ":America/Denver" # Home of WWVB
|
||||
time.tzset()
|
||||
|
||||
|
||||
def tearDownModule():
|
||||
if old_tz is None:
|
||||
del os.environ["TZ"]
|
||||
else:
|
||||
os.environ["TZ"] = old_tz
|
||||
time.tzset()
|
||||
|
||||
|
||||
class WWVBTestCase(unittest.TestCase):
|
||||
maxDiff = 131072
|
||||
|
||||
|
|
|
|||
127
tzinfo_us.py
Normal file
127
tzinfo_us.py
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
# SPDX-FileCopyrightText: 2021 Alexander Belopolsky, Christian Heimes, Georg Brandl, Marco Buttu, Raymond Hettinger, Sergey Fedoseev, Jeff Epler
|
||||
#
|
||||
# SPDX-License-Identifier: Python-2.0
|
||||
|
||||
from datetime import tzinfo, timedelta, datetime
|
||||
|
||||
ZERO = timedelta(0)
|
||||
HOUR = timedelta(hours=1)
|
||||
|
||||
# A complete implementation of current DST rules for major US time zones.
|
||||
|
||||
|
||||
def first_sunday_on_or_after(dt):
|
||||
days_to_go = 6 - dt.weekday()
|
||||
if days_to_go:
|
||||
dt += timedelta(days_to_go)
|
||||
return dt
|
||||
|
||||
|
||||
# US DST Rules
|
||||
#
|
||||
# This is a simplified (i.e., wrong for a few cases) set of rules for US
|
||||
# DST start and end times. For a complete and up-to-date set of DST rules
|
||||
# and timezone definitions, visit the Olson Database (or try pytz):
|
||||
# http://www.twinsun.com/tz/tz-link.htm
|
||||
# http://sourceforge.net/projects/pytz/ (might not be up-to-date)
|
||||
#
|
||||
# In the US, since 2007, DST starts at 2am (standard time) on the second
|
||||
# Sunday in March, which is the first Sunday on or after Mar 8.
|
||||
DSTSTART_2007 = datetime(1, 3, 8, 2)
|
||||
# and ends at 2am (DST time) on the first Sunday of Nov.
|
||||
DSTEND_2007 = datetime(1, 11, 1, 2)
|
||||
# From 1987 to 2006, DST used to start at 2am (standard time) on the first
|
||||
# Sunday in April and to end at 2am (DST time) on the last
|
||||
# Sunday of October, which is the first Sunday on or after Oct 25.
|
||||
DSTSTART_1987_2006 = datetime(1, 4, 1, 2)
|
||||
DSTEND_1987_2006 = datetime(1, 10, 25, 2)
|
||||
# From 1967 to 1986, DST used to start at 2am (standard time) on the last
|
||||
# Sunday in April (the one on or after April 24) and to end at 2am (DST time)
|
||||
# on the last Sunday of October, which is the first Sunday
|
||||
# on or after Oct 25.
|
||||
DSTSTART_1967_1986 = datetime(1, 4, 24, 2)
|
||||
DSTEND_1967_1986 = DSTEND_1987_2006
|
||||
|
||||
|
||||
def us_dst_range(year):
|
||||
# Find start and end times for US DST. For years before 1967, return
|
||||
# start = end for no DST.
|
||||
if 2006 < year:
|
||||
dststart, dstend = DSTSTART_2007, DSTEND_2007
|
||||
elif 1986 < year < 2007:
|
||||
dststart, dstend = DSTSTART_1987_2006, DSTEND_1987_2006
|
||||
elif 1966 < year < 1987:
|
||||
dststart, dstend = DSTSTART_1967_1986, DSTEND_1967_1986
|
||||
else:
|
||||
return (datetime(year, 1, 1),) * 2
|
||||
|
||||
start = first_sunday_on_or_after(dststart.replace(year=year))
|
||||
end = first_sunday_on_or_after(dstend.replace(year=year))
|
||||
return start, end
|
||||
|
||||
|
||||
class USTimeZone(tzinfo):
|
||||
def __init__(self, hours, reprname, stdname, dstname):
|
||||
self.stdoffset = timedelta(hours=hours)
|
||||
self.reprname = reprname
|
||||
self.stdname = stdname
|
||||
self.dstname = dstname
|
||||
|
||||
def __repr__(self):
|
||||
return self.reprname
|
||||
|
||||
def tzname(self, dt):
|
||||
if self.dst(dt):
|
||||
return self.dstname
|
||||
else:
|
||||
return self.stdname
|
||||
|
||||
def utcoffset(self, dt):
|
||||
return self.stdoffset + self.dst(dt)
|
||||
|
||||
def dst(self, dt):
|
||||
if dt is None or dt.tzinfo is None:
|
||||
# An exception may be sensible here, in one or both cases.
|
||||
# It depends on how you want to treat them. The default
|
||||
# fromutc() implementation (called by the default astimezone()
|
||||
# implementation) passes a datetime with dt.tzinfo is self.
|
||||
return ZERO
|
||||
assert dt.tzinfo is self
|
||||
start, end = us_dst_range(dt.year)
|
||||
# Can't compare naive to aware objects, so strip the timezone from
|
||||
# dt first.
|
||||
dt = dt.replace(tzinfo=None)
|
||||
if start + HOUR <= dt < end - HOUR:
|
||||
# DST is in effect.
|
||||
return HOUR
|
||||
if end - HOUR <= dt < end:
|
||||
# Fold (an ambiguous hour): use dt.fold to disambiguate.
|
||||
return ZERO if dt.fold else HOUR
|
||||
if start <= dt < start + HOUR:
|
||||
# Gap (a non-existent hour): reverse the fold rule.
|
||||
return HOUR if dt.fold else ZERO
|
||||
# DST is off.
|
||||
return ZERO
|
||||
|
||||
def fromutc(self, dt):
|
||||
assert dt.tzinfo is self
|
||||
start, end = us_dst_range(dt.year)
|
||||
start = start.replace(tzinfo=self)
|
||||
end = end.replace(tzinfo=self)
|
||||
std_time = dt + self.stdoffset
|
||||
dst_time = std_time + HOUR
|
||||
if end <= dst_time < end + HOUR:
|
||||
# Repeated hour
|
||||
return std_time.replace(fold=1)
|
||||
if std_time < start or dst_time >= end:
|
||||
# Standard time
|
||||
return std_time
|
||||
if start <= std_time < end - HOUR:
|
||||
# Daylight saving time
|
||||
return dst_time
|
||||
|
||||
|
||||
Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")
|
||||
Central = USTimeZone(-6, "Central", "CST", "CDT")
|
||||
Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
|
||||
Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")
|
||||
|
|
@ -18,6 +18,8 @@ import iersdata
|
|||
|
||||
from typing import Dict, List, Tuple
|
||||
|
||||
from tzinfo_us import Mountain
|
||||
|
||||
|
||||
def get_dut1(t):
|
||||
i = (t - iersdata.dut1_data_start).days
|
||||
|
|
@ -40,12 +42,9 @@ def isls(t):
|
|||
|
||||
|
||||
def isdst(t):
|
||||
t0 = datetime.datetime(1970, 1, 1)
|
||||
if isinstance(t, datetime.date):
|
||||
t = datetime.datetime(t.year, t.month, t.day)
|
||||
d = t - t0
|
||||
stamp = d.days * 86400 + d.seconds + d.microseconds * 1e-6
|
||||
return time.localtime(stamp).tm_isdst
|
||||
return bool(t.astimezone(Mountain).dst())
|
||||
|
||||
|
||||
def first_sunday_in_month(y, m):
|
||||
|
|
|
|||
Loading…
Reference in a new issue