Currently we implement adding units larger than `.day` as follows:
- Convert the date to date components
- Update the value of the added component
- Convert the date components back to date
The time of the day information is reduced to a `DateComponents` with, e.g. `hour == 1`, `minute == 30`, at step 1. Then when we convert the `DateComponents` back to `Date` at step 3, we always use the *first* occurrence of the time if it falls into the DST repeated time frame.
This is different from `Calendar_ICU`'s implementation, which uses the *latter* and rewind back the date by the DST transition interval (e.g. 1 hour for Pacific Time).
These yeild the same result except for when the input time and the output time are *both* during DST transition time frame. Update the implementation to match Calendar_ICU's behavior.
* [GregorianCalendar] Implement TimeZone support for `date(from components: DateComponents)`
To support DST-observing time zone, add a helper function for TimeZone to return the raw offset and DST offset individually so we can fine tune the behavior for the time during the skipped time frame and the repeated time frame.
* remove an accidental import
* Add non-compatibility tests
* Review feedback: Remove mention of "GMT" in the date argument
* Review feedback: Change the returning type of DST offset from Int to TimeInterval to be consistent with the existing dstOffset API
* Implement the required function for _TimeZoneBridged
* Fix a missing import