| 2126 | |
| 2127 | @dataclasses.dataclass(frozen=True) |
| 2128 | class ZoneTransition: |
| 2129 | transition: datetime |
| 2130 | offset_before: ZoneOffset |
| 2131 | offset_after: ZoneOffset |
| 2132 | |
| 2133 | @property |
| 2134 | def transition_utc(self): |
| 2135 | return (self.transition - self.offset_before.utcoffset).replace( |
| 2136 | tzinfo=timezone.utc |
| 2137 | ) |
| 2138 | |
| 2139 | @property |
| 2140 | def fold(self): |
| 2141 | """Whether this introduces a fold""" |
| 2142 | return self.offset_before.utcoffset > self.offset_after.utcoffset |
| 2143 | |
| 2144 | @property |
| 2145 | def gap(self): |
| 2146 | """Whether this introduces a gap""" |
| 2147 | return self.offset_before.utcoffset < self.offset_after.utcoffset |
| 2148 | |
| 2149 | @property |
| 2150 | def delta(self): |
| 2151 | return self.offset_after.utcoffset - self.offset_before.utcoffset |
| 2152 | |
| 2153 | @property |
| 2154 | def anomaly_start(self): |
| 2155 | if self.fold: |
| 2156 | return self.transition + self.delta |
| 2157 | else: |
| 2158 | return self.transition |
| 2159 | |
| 2160 | @property |
| 2161 | def anomaly_end(self): |
| 2162 | if not self.fold: |
| 2163 | return self.transition + self.delta |
| 2164 | else: |
| 2165 | return self.transition |
| 2166 | |
| 2167 | |
| 2168 | class ZoneInfoData: |
no outgoing calls
searching dependent graphs…