A new version of Chronology-Core was added to project The Inbox: http://source.squeak.org/inbox/Chronology-Core-dtl.83.mcz
==================== Summary ====================
Name: Chronology-Core-dtl.83 Author: dtl Time: 18 June 2023, 4:39:00.39056 pm UUID: 5533f6f0-9e47-478e-bc41-59aaee83a4bf Ancestors: Chronology-Core-mt.82
Establish protocol for aTimeZone offsetAt: aDateAndTime. Let TimeZone be abstract and let FixedTimeZone implement the previous behavior with offset represented as a constant (no DST transition support). Other packages (e.g. TZ-Olson) may implement concrete TimeZone with DST support.
Also add TimeZone class>>allForOffset: as proposed by Christoph Thiede on squeak-dev (Review Request: allTimeZones.4.cs, Thu, 18 May 2023 22:11:32 +0200)
=============== Diff against Chronology-Core-mt.82 ===============
Item was changed: ----- Method: DateAndTime class>>localOffset: (in category 'squeak protocol') ----- localOffset: aDuration "Override the local time zone (for testing). This disables the #automaticTimezone: preference" + self localTimeZone: (FixedTimeZone offset: aDuration name: 'Local Time (override)' abbreviation: 'LTO'). - self localTimeZone: (TimeZone offset: aDuration name: 'Local Time (override)' abbreviation: 'LTO'). !
Item was added: + TimeZone subclass: #FixedTimeZone + instanceVariableNames: 'offset abbreviation name' + classVariableNames: '' + poolDictionaries: 'ChronologyConstants' + category: 'Chronology-Core'! + + !FixedTimeZone commentStamp: 'dtl 6/3/2023 00:26' prior: 0! + StaticTimeZone is a simple class to collect the information identifying a UTC time zone. It is typically used in unit tests to specify specific time zone offsets. + + offset - Duration - the time zone's offset from UTC + abbreviation - String - the abbreviated name for the time zone. + name - String - the name of the time zone. + + StaticTimeZone class >> #timeZones returns an array of the known time zones + StaticTimeZone class >> #default returns the default time zone (Greenwich Mean Time) + !
Item was added: + ----- Method: FixedTimeZone class>>allTimeZones (in category 'accessing') ----- + allTimeZones + + ^ self timeZones , self timeZonesDST!
Item was added: + ----- Method: FixedTimeZone class>>default (in category 'accessing') ----- + default + "Answer the default time zone - GMT" + + ^ self timeZones detect: [ :tz | tz offset = Duration zero ]!
Item was added: + ----- Method: FixedTimeZone class>>offset:name:abbreviation: (in category 'instance creation') ----- + offset: aDuration name: aName abbreviation: anAbbreviation + + ^ self new + offset: aDuration; + name: aName; + abbreviation: anAbbreviation; + yourself + !
Item was added: + ----- Method: FixedTimeZone class>>timeZones (in category 'accessing') ----- + timeZones + ^{ + self offset: 0 hours name: 'Universal Time' abbreviation: 'UTC'. + self offset: 0 hours name: 'Greenwich Mean Time' abbreviation: 'GMT'. + self offset: 1 hours name: 'Central European Time' abbreviation: 'CET'. + self offset: 2 hours name: 'South African Standard Time' abbreviation: 'SAST'. + self offset: -8 hours name: 'Pacific Standard Time' abbreviation: 'PST'. + self offset: -7 hours name: 'Mountain Standard Time' abbreviation: 'MST'. + self offset: -6 hours name: 'Central Standard Time' abbreviation: 'CST'. + self offset: -5 hours name: 'Eastern Standard Time' abbreviation: 'EST'. + }!
Item was added: + ----- Method: FixedTimeZone class>>timeZonesDST (in category 'accessing') ----- + timeZonesDST + ^{ + self offset: 1 hours name: 'British Summer Time' abbreviation: 'BST'. + self offset: 2 hours name: 'Central European Summer Time' abbreviation: 'CEST'. + self offset: -7 hours name: 'Pacific Daylight Time' abbreviation: 'PDT'. + self offset: -6 hours name: 'Mountain Daylight Time' abbreviation: 'MDT'. + self offset: -5 hours name: 'Central Daylight Time' abbreviation: 'CDT'. + self offset: -4 hours name: 'Eastern Daylight Time' abbreviation: 'EDT'. + }!
Item was added: + ----- Method: FixedTimeZone>>abbreviation (in category 'accessing') ----- + abbreviation + + ^ abbreviation!
Item was added: + ----- Method: FixedTimeZone>>abbreviation: (in category 'accessing') ----- + abbreviation: aString + + abbreviation := aString!
Item was added: + ----- Method: FixedTimeZone>>name (in category 'accessing') ----- + name + + ^ name!
Item was added: + ----- Method: FixedTimeZone>>name: (in category 'accessing') ----- + name: aString + + name := aString!
Item was added: + ----- Method: FixedTimeZone>>offset: (in category 'accessing') ----- + offset: aDuration + + offset := aDuration + !
Item was added: + ----- Method: FixedTimeZone>>offsetAt: (in category 'accessing') ----- + offsetAt: dateAndTime + "A ConstantTimeZone has a constant offset, ignoring daylight savings time transitions" + + ^ offset + !
Item was added: + ----- Method: FixedTimeZone>>printOn: (in category 'private') ----- + printOn: aStream + + super printOn: aStream. + aStream + nextPut: $(; + nextPutAll: self abbreviation; + nextPut: $)!
Item was changed: Object subclass: #TimeZone + instanceVariableNames: '' - instanceVariableNames: 'offset abbreviation name' classVariableNames: '' poolDictionaries: 'ChronologyConstants' category: 'Chronology-Core'!
+ !TimeZone commentStamp: 'dtl 6/15/2023 22:27' prior: 0! + A TimeZone answers the UTC offset for a DateAndTime based on local rules for a geographic region. For each regional time zone, the UTC offset varies as a function of the DateAndTime, notably in support of daylight savings time changes. The UTC offset for a TimeZone also may change over time as local rules are updated for various regions and political jurisdictions. - !TimeZone commentStamp: 'dtl 7/11/2009 15:03' prior: 0! - TimeZone is a simple class to colect the information identifying a UTC time zone.
+ Concrete subclasses are expected to implement UTC offset rules. The simple case of FixedTimeZone implements a time zone with constant offset, which is useful for unit test support.! - offset - Duration - the time zone's offset from UTC - abbreviation - String - the abbreviated name for the time zone. - name - String - the name of the time zone. - - TimeZone class >> #timeZones returns an array of the known time zones - TimeZone class >> #default returns the default time zone (Grenwich Mean Time) - !
Item was added: + ----- Method: TimeZone class>>allForOffset: (in category 'accessing') ----- + allForOffset: aDuration + + ^ self allTimeZones select: [:ea | ea offset = aDuration]!
Item was added: + ----- Method: TimeZone class>>allTimeZones (in category 'accessing') ----- + allTimeZones + "Various concrete implementations may be available. These may include a + simple StaticTimeZone or e.g. the TZ-Olson time zone tables with daylight + savings time offset transitions." + + ^ self allSubclasses + inject: OrderedCollection new + into: [ :result :cls | + (cls class includesLocalSelector: #allTimeZones) + ifTrue: [result addAll: cls allTimeZones]. + result]. + !
Item was changed: ----- Method: TimeZone class>>default (in category 'accessing') ----- default "Answer the default time zone - GMT"
+ ^ FixedTimeZone default! - ^ self timeZones detect: [ :tz | tz offset = Duration zero ]!
Item was removed: - ----- Method: TimeZone class>>offset:name:abbreviation: (in category 'instance creation') ----- - offset: aDuration name: aName abbreviation: anAbbreviation - - ^ self new - offset: aDuration; - name: aName; - abbreviation: anAbbreviation; - yourself - !
Item was removed: - ----- Method: TimeZone class>>timeZones (in category 'accessing') ----- - timeZones - ^{ - self offset: 0 hours name: 'Universal Time' abbreviation: 'UTC'. - self offset: 0 hours name: 'Greenwich Mean Time' abbreviation: 'GMT'. - self offset: 1 hours name: 'Central European Time' abbreviation: 'CET'. - self offset: 2 hours name: 'South African Standard Time' abbreviation: 'SAST'. - self offset: -8 hours name: 'Pacific Standard Time' abbreviation: 'PST'. - self offset: -7 hours name: 'Mountain Standard Time' abbreviation: 'MST'. - self offset: -6 hours name: 'Central Standard Time' abbreviation: 'CST'. - self offset: -5 hours name: 'Eastern Standard Time' abbreviation: 'EST'. - }!
Item was removed: - ----- Method: TimeZone class>>timeZonesDST (in category 'accessing') ----- - timeZonesDST - ^{ - self offset: 1 hours name: 'British Summer Time' abbreviation: 'BST'. - self offset: 2 hours name: 'Central European Summer Time' abbreviation: 'CEST'. - self offset: -7 hours name: 'Pacific Daylight Time' abbreviation: 'PDT'. - self offset: -6 hours name: 'Mountain Daylight Time' abbreviation: 'MDT'. - self offset: -5 hours name: 'Central Daylight Time' abbreviation: 'CDT'. - self offset: -4 hours name: 'Eastern Daylight Time' abbreviation: 'EDT'. - }!
Item was changed: ----- Method: TimeZone>>abbreviation (in category 'accessing') ----- abbreviation
+ ^ self subclassResponsibility! - ^ abbreviation!
Item was removed: - ----- Method: TimeZone>>abbreviation: (in category 'accessing') ----- - abbreviation: aString - - abbreviation := aString!
Item was changed: ----- Method: TimeZone>>name (in category 'accessing') ----- name
+ ^ self subclassResponsibility! - ^ name!
Item was removed: - ----- Method: TimeZone>>name: (in category 'accessing') ----- - name: aString - - name := aString!
Item was changed: ----- Method: TimeZone>>offset (in category 'accessing') ----- offset + "Answer the current offset"
+ ^ self offsetAt: DateAndTime now - ^ offset !
Item was removed: - ----- Method: TimeZone>>offset: (in category 'accessing') ----- - offset: aDuration - - offset := aDuration - !
Item was added: + ----- Method: TimeZone>>offsetAt: (in category 'accessing') ----- + offsetAt: dateAndTime + + ^ self subclassResponsibility + !
Item was removed: - ----- Method: TimeZone>>printOn: (in category 'private') ----- - printOn: aStream - - super printOn: aStream. - aStream - nextPut: $(; - nextPutAll: self abbreviation; - nextPut: $)!
Item was changed: + (PackageInfo named: 'Chronology-Core') postscript: '"StaticTimeZone is now the concrete implementation of TimeZone" + + DateAndTime localTimeZone == TimeZone + ifTrue: [ | newInstance | + newInstance := StaticTimeZone + offset: DateAndTime localTimeZone offset + name: DateAndTime localTimeZone name + abbreviation: DateAndTime localTimeZone abbreviation. + DateAndTime localTimeZone: newInstance ]. + '! - (PackageInfo named: 'Chronology-Core') postscript: 'Smalltalk removeFromStartUpList: DateAndTime'!
Looks good. Minor typo "StaticTimeZone" in class comment of FixedTimeZone.
Would you sketch a possible second variation for TimeZone in addition to FixedTimeZone?
Best, Marcel Am 19.06.2023 00:57:48 schrieb commits@source.squeak.org commits@source.squeak.org: A new version of Chronology-Core was added to project The Inbox: http://source.squeak.org/inbox/Chronology-Core-dtl.83.mcz
==================== Summary ====================
Name: Chronology-Core-dtl.83 Author: dtl Time: 18 June 2023, 4:39:00.39056 pm UUID: 5533f6f0-9e47-478e-bc41-59aaee83a4bf Ancestors: Chronology-Core-mt.82
Establish protocol for aTimeZone offsetAt: aDateAndTime. Let TimeZone be abstract and let FixedTimeZone implement the previous behavior with offset represented as a constant (no DST transition support). Other packages (e.g. TZ-Olson) may implement concrete TimeZone with DST support.
Also add TimeZone class>>allForOffset: as proposed by Christoph Thiede on squeak-dev (Review Request: allTimeZones.4.cs, Thu, 18 May 2023 22:11:32 +0200)
=============== Diff against Chronology-Core-mt.82 ===============
Item was changed: ----- Method: DateAndTime class>>localOffset: (in category 'squeak protocol') ----- localOffset: aDuration "Override the local time zone (for testing). This disables the #automaticTimezone: preference" + self localTimeZone: (FixedTimeZone offset: aDuration name: 'Local Time (override)' abbreviation: 'LTO'). - self localTimeZone: (TimeZone offset: aDuration name: 'Local Time (override)' abbreviation: 'LTO'). !
Item was added: + TimeZone subclass: #FixedTimeZone + instanceVariableNames: 'offset abbreviation name' + classVariableNames: '' + poolDictionaries: 'ChronologyConstants' + category: 'Chronology-Core'! + + !FixedTimeZone commentStamp: 'dtl 6/3/2023 00:26' prior: 0! + StaticTimeZone is a simple class to collect the information identifying a UTC time zone. It is typically used in unit tests to specify specific time zone offsets. + + offset - Duration - the time zone's offset from UTC + abbreviation - String - the abbreviated name for the time zone. + name - String - the name of the time zone. + + StaticTimeZone class >> #timeZones returns an array of the known time zones + StaticTimeZone class >> #default returns the default time zone (Greenwich Mean Time) + !
Item was added: + ----- Method: FixedTimeZone class>>allTimeZones (in category 'accessing') ----- + allTimeZones + + ^ self timeZones , self timeZonesDST!
Item was added: + ----- Method: FixedTimeZone class>>default (in category 'accessing') ----- + default + "Answer the default time zone - GMT" + + ^ self timeZones detect: [ :tz | tz offset = Duration zero ]!
Item was added: + ----- Method: FixedTimeZone class>>offset:name:abbreviation: (in category 'instance creation') ----- + offset: aDuration name: aName abbreviation: anAbbreviation + + ^ self new + offset: aDuration; + name: aName; + abbreviation: anAbbreviation; + yourself + !
Item was added: + ----- Method: FixedTimeZone class>>timeZones (in category 'accessing') ----- + timeZones + ^{ + self offset: 0 hours name: 'Universal Time' abbreviation: 'UTC'. + self offset: 0 hours name: 'Greenwich Mean Time' abbreviation: 'GMT'. + self offset: 1 hours name: 'Central European Time' abbreviation: 'CET'. + self offset: 2 hours name: 'South African Standard Time' abbreviation: 'SAST'. + self offset: -8 hours name: 'Pacific Standard Time' abbreviation: 'PST'. + self offset: -7 hours name: 'Mountain Standard Time' abbreviation: 'MST'. + self offset: -6 hours name: 'Central Standard Time' abbreviation: 'CST'. + self offset: -5 hours name: 'Eastern Standard Time' abbreviation: 'EST'. + }!
Item was added: + ----- Method: FixedTimeZone class>>timeZonesDST (in category 'accessing') ----- + timeZonesDST + ^{ + self offset: 1 hours name: 'British Summer Time' abbreviation: 'BST'. + self offset: 2 hours name: 'Central European Summer Time' abbreviation: 'CEST'. + self offset: -7 hours name: 'Pacific Daylight Time' abbreviation: 'PDT'. + self offset: -6 hours name: 'Mountain Daylight Time' abbreviation: 'MDT'. + self offset: -5 hours name: 'Central Daylight Time' abbreviation: 'CDT'. + self offset: -4 hours name: 'Eastern Daylight Time' abbreviation: 'EDT'. + }!
Item was added: + ----- Method: FixedTimeZone>>abbreviation (in category 'accessing') ----- + abbreviation + + ^ abbreviation!
Item was added: + ----- Method: FixedTimeZone>>abbreviation: (in category 'accessing') ----- + abbreviation: aString + + abbreviation := aString!
Item was added: + ----- Method: FixedTimeZone>>name (in category 'accessing') ----- + name + + ^ name!
Item was added: + ----- Method: FixedTimeZone>>name: (in category 'accessing') ----- + name: aString + + name := aString!
Item was added: + ----- Method: FixedTimeZone>>offset: (in category 'accessing') ----- + offset: aDuration + + offset := aDuration + !
Item was added: + ----- Method: FixedTimeZone>>offsetAt: (in category 'accessing') ----- + offsetAt: dateAndTime + "A ConstantTimeZone has a constant offset, ignoring daylight savings time transitions" + + ^ offset + !
Item was added: + ----- Method: FixedTimeZone>>printOn: (in category 'private') ----- + printOn: aStream + + super printOn: aStream. + aStream + nextPut: $(; + nextPutAll: self abbreviation; + nextPut: $)!
Item was changed: Object subclass: #TimeZone + instanceVariableNames: '' - instanceVariableNames: 'offset abbreviation name' classVariableNames: '' poolDictionaries: 'ChronologyConstants' category: 'Chronology-Core'!
+ !TimeZone commentStamp: 'dtl 6/15/2023 22:27' prior: 0! + A TimeZone answers the UTC offset for a DateAndTime based on local rules for a geographic region. For each regional time zone, the UTC offset varies as a function of the DateAndTime, notably in support of daylight savings time changes. The UTC offset for a TimeZone also may change over time as local rules are updated for various regions and political jurisdictions. - !TimeZone commentStamp: 'dtl 7/11/2009 15:03' prior: 0! - TimeZone is a simple class to colect the information identifying a UTC time zone.
+ Concrete subclasses are expected to implement UTC offset rules. The simple case of FixedTimeZone implements a time zone with constant offset, which is useful for unit test support.! - offset - Duration - the time zone's offset from UTC - abbreviation - String - the abbreviated name for the time zone. - name - String - the name of the time zone. - - TimeZone class >> #timeZones returns an array of the known time zones - TimeZone class >> #default returns the default time zone (Grenwich Mean Time) - !
Item was added: + ----- Method: TimeZone class>>allForOffset: (in category 'accessing') ----- + allForOffset: aDuration + + ^ self allTimeZones select: [:ea | ea offset = aDuration]!
Item was added: + ----- Method: TimeZone class>>allTimeZones (in category 'accessing') ----- + allTimeZones + "Various concrete implementations may be available. These may include a + simple StaticTimeZone or e.g. the TZ-Olson time zone tables with daylight + savings time offset transitions." + + ^ self allSubclasses + inject: OrderedCollection new + into: [ :result :cls | + (cls class includesLocalSelector: #allTimeZones) + ifTrue: [result addAll: cls allTimeZones]. + result]. + !
Item was changed: ----- Method: TimeZone class>>default (in category 'accessing') ----- default "Answer the default time zone - GMT"
+ ^ FixedTimeZone default! - ^ self timeZones detect: [ :tz | tz offset = Duration zero ]!
Item was removed: - ----- Method: TimeZone class>>offset:name:abbreviation: (in category 'instance creation') ----- - offset: aDuration name: aName abbreviation: anAbbreviation - - ^ self new - offset: aDuration; - name: aName; - abbreviation: anAbbreviation; - yourself - !
Item was removed: - ----- Method: TimeZone class>>timeZones (in category 'accessing') ----- - timeZones - ^{ - self offset: 0 hours name: 'Universal Time' abbreviation: 'UTC'. - self offset: 0 hours name: 'Greenwich Mean Time' abbreviation: 'GMT'. - self offset: 1 hours name: 'Central European Time' abbreviation: 'CET'. - self offset: 2 hours name: 'South African Standard Time' abbreviation: 'SAST'. - self offset: -8 hours name: 'Pacific Standard Time' abbreviation: 'PST'. - self offset: -7 hours name: 'Mountain Standard Time' abbreviation: 'MST'. - self offset: -6 hours name: 'Central Standard Time' abbreviation: 'CST'. - self offset: -5 hours name: 'Eastern Standard Time' abbreviation: 'EST'. - }!
Item was removed: - ----- Method: TimeZone class>>timeZonesDST (in category 'accessing') ----- - timeZonesDST - ^{ - self offset: 1 hours name: 'British Summer Time' abbreviation: 'BST'. - self offset: 2 hours name: 'Central European Summer Time' abbreviation: 'CEST'. - self offset: -7 hours name: 'Pacific Daylight Time' abbreviation: 'PDT'. - self offset: -6 hours name: 'Mountain Daylight Time' abbreviation: 'MDT'. - self offset: -5 hours name: 'Central Daylight Time' abbreviation: 'CDT'. - self offset: -4 hours name: 'Eastern Daylight Time' abbreviation: 'EDT'. - }!
Item was changed: ----- Method: TimeZone>>abbreviation (in category 'accessing') ----- abbreviation
+ ^ self subclassResponsibility! - ^ abbreviation!
Item was removed: - ----- Method: TimeZone>>abbreviation: (in category 'accessing') ----- - abbreviation: aString - - abbreviation := aString!
Item was changed: ----- Method: TimeZone>>name (in category 'accessing') ----- name
+ ^ self subclassResponsibility! - ^ name!
Item was removed: - ----- Method: TimeZone>>name: (in category 'accessing') ----- - name: aString - - name := aString!
Item was changed: ----- Method: TimeZone>>offset (in category 'accessing') ----- offset + "Answer the current offset"
+ ^ self offsetAt: DateAndTime now - ^ offset !
Item was removed: - ----- Method: TimeZone>>offset: (in category 'accessing') ----- - offset: aDuration - - offset := aDuration - !
Item was added: + ----- Method: TimeZone>>offsetAt: (in category 'accessing') ----- + offsetAt: dateAndTime + + ^ self subclassResponsibility + !
Item was removed: - ----- Method: TimeZone>>printOn: (in category 'private') ----- - printOn: aStream - - super printOn: aStream. - aStream - nextPut: $(; - nextPutAll: self abbreviation; - nextPut: $)!
Item was changed: + (PackageInfo named: 'Chronology-Core') postscript: '"StaticTimeZone is now the concrete implementation of TimeZone" + + DateAndTime localTimeZone == TimeZone + ifTrue: [ | newInstance | + newInstance := StaticTimeZone + offset: DateAndTime localTimeZone offset + name: DateAndTime localTimeZone name + abbreviation: DateAndTime localTimeZone abbreviation. + DateAndTime localTimeZone: newInstance ]. + '! - (PackageInfo named: 'Chronology-Core') postscript: 'Smalltalk removeFromStartUpList: DateAndTime'!
On Tue, Jun 20, 2023 at 11:45:27AM +0200, Marcel Taeumel via Squeak-dev wrote:
Looks good. Minor typo "StaticTimeZone" in class comment of FixedTimeZone.
Thanks, good catch. I put a replacement Chronology-Core-dtl.84 in inbox. For now I'll leave Chronology-Core-dtl.83 in the inbox because it is referenced from another thread:
https://lists.squeakfoundation.org/archives/list/squeak-dev@lists.squeakfoun...
Would you sketch a possible second variation for TimeZone in addition to FixedTimeZone?
Yes. TimeZoneRuleSet works as a concrete implementation of TimeZone, see attached image for reference.
If you have access to a Linux/unix box with time zone tables available in the /usr/share/zoneinfo folder, you can load those time zones into Squeak by installing the TZ-Olson package from the SqueakMap package loader. This is based on a package that I wrote a few years ago(*), and updated recently to let the time zone tables be subclassed from Squeak TimeZone.
I assume you are working on Windows, so I'll have to figure out a way to get some time zone tables available there. But even without that, you can load the package and see how it works.
For example, if you wanted to know what the time zone offset was in Switzerland last winter, you might do this:
((DateAndTime now - 180 days) inTimeZoneNamed: 'Europe/Zurich' ) offset
Dave
(*) Maybe more that a few years ago, actually I wrote it back in 1999, see https://wiki.squeak.org/squeak/1076
Best, Marcel Am 19.06.2023 00:57:48 schrieb commits@source.squeak.org commits@source.squeak.org: A new version of Chronology-Core was added to project The Inbox: http://source.squeak.org/inbox/Chronology-Core-dtl.83.mcz
==================== Summary ====================
Name: Chronology-Core-dtl.83 Author: dtl Time: 18 June 2023, 4:39:00.39056 pm UUID: 5533f6f0-9e47-478e-bc41-59aaee83a4bf Ancestors: Chronology-Core-mt.82
Establish protocol for aTimeZone offsetAt: aDateAndTime. Let TimeZone be abstract and let FixedTimeZone implement the previous behavior with offset represented as a constant (no DST transition support). Other packages (e.g. TZ-Olson) may implement concrete TimeZone with DST support.
Also add TimeZone class>>allForOffset: as proposed by Christoph Thiede on squeak-dev (Review Request: allTimeZones.4.cs, Thu, 18 May 2023 22:11:32 +0200)
=============== Diff against Chronology-Core-mt.82 ===============
Item was changed: ----- Method: DateAndTime class>>localOffset: (in category 'squeak protocol') ----- localOffset: aDuration "Override the local time zone (for testing). This disables the #automaticTimezone: preference"
- self localTimeZone: (FixedTimeZone offset: aDuration name: 'Local Time (override)' abbreviation: 'LTO').
- self localTimeZone: (TimeZone offset: aDuration name: 'Local Time (override)' abbreviation: 'LTO').
!
Item was added:
- TimeZone subclass: #FixedTimeZone
- instanceVariableNames: 'offset abbreviation name'
- classVariableNames: ''
- poolDictionaries: 'ChronologyConstants'
- category: 'Chronology-Core'!
- !FixedTimeZone commentStamp: 'dtl 6/3/2023 00:26' prior: 0!
- StaticTimeZone is a simple class to collect the information identifying a UTC time zone. It is typically used in unit tests to specify specific time zone offsets.
- offset - Duration - the time zone's offset from UTC
- abbreviation - String - the abbreviated name for the time zone.
- name - String - the name of the time zone.
- StaticTimeZone class >> #timeZones returns an array of the known time zones
- StaticTimeZone class >> #default returns the default time zone (Greenwich Mean Time)
- !
Item was added:
- ----- Method: FixedTimeZone class>>allTimeZones (in category 'accessing') -----
- allTimeZones
- ^ self timeZones , self timeZonesDST!
Item was added:
- ----- Method: FixedTimeZone class>>default (in category 'accessing') -----
- default
- "Answer the default time zone - GMT"
- ^ self timeZones detect: [ :tz | tz offset = Duration zero ]!
Item was added:
- ----- Method: FixedTimeZone class>>offset:name:abbreviation: (in category 'instance creation') -----
- offset: aDuration name: aName abbreviation: anAbbreviation
- ^ self new
- offset: aDuration;
- name: aName;
- abbreviation: anAbbreviation;
- yourself
- !
Item was added:
- ----- Method: FixedTimeZone class>>timeZones (in category 'accessing') -----
- timeZones
- ^{
- self offset: 0 hours name: 'Universal Time' abbreviation: 'UTC'.
- self offset: 0 hours name: 'Greenwich Mean Time' abbreviation: 'GMT'.
- self offset: 1 hours name: 'Central European Time' abbreviation: 'CET'.
- self offset: 2 hours name: 'South African Standard Time' abbreviation: 'SAST'.
- self offset: -8 hours name: 'Pacific Standard Time' abbreviation: 'PST'.
- self offset: -7 hours name: 'Mountain Standard Time' abbreviation: 'MST'.
- self offset: -6 hours name: 'Central Standard Time' abbreviation: 'CST'.
- self offset: -5 hours name: 'Eastern Standard Time' abbreviation: 'EST'.
- }!
Item was added:
- ----- Method: FixedTimeZone class>>timeZonesDST (in category 'accessing') -----
- timeZonesDST
- ^{
- self offset: 1 hours name: 'British Summer Time' abbreviation: 'BST'.
- self offset: 2 hours name: 'Central European Summer Time' abbreviation: 'CEST'.
- self offset: -7 hours name: 'Pacific Daylight Time' abbreviation: 'PDT'.
- self offset: -6 hours name: 'Mountain Daylight Time' abbreviation: 'MDT'.
- self offset: -5 hours name: 'Central Daylight Time' abbreviation: 'CDT'.
- self offset: -4 hours name: 'Eastern Daylight Time' abbreviation: 'EDT'.
- }!
Item was added:
- ----- Method: FixedTimeZone>>abbreviation (in category 'accessing') -----
- abbreviation
- ^ abbreviation!
Item was added:
- ----- Method: FixedTimeZone>>abbreviation: (in category 'accessing') -----
- abbreviation: aString
- abbreviation := aString!
Item was added:
- ----- Method: FixedTimeZone>>name (in category 'accessing') -----
- name
- ^ name!
Item was added:
- ----- Method: FixedTimeZone>>name: (in category 'accessing') -----
- name: aString
- name := aString!
Item was added:
- ----- Method: FixedTimeZone>>offset: (in category 'accessing') -----
- offset: aDuration
- offset := aDuration
- !
Item was added:
- ----- Method: FixedTimeZone>>offsetAt: (in category 'accessing') -----
- offsetAt: dateAndTime
- "A ConstantTimeZone has a constant offset, ignoring daylight savings time transitions"
- ^ offset
- !
Item was added:
- ----- Method: FixedTimeZone>>printOn: (in category 'private') -----
- printOn: aStream
- super printOn: aStream.
- aStream
- nextPut: $(;
- nextPutAll: self abbreviation;
- nextPut: $)!
Item was changed: Object subclass: #TimeZone
- instanceVariableNames: ''
- instanceVariableNames: 'offset abbreviation name'
classVariableNames: '' poolDictionaries: 'ChronologyConstants' category: 'Chronology-Core'!
- !TimeZone commentStamp: 'dtl 6/15/2023 22:27' prior: 0!
- A TimeZone answers the UTC offset for a DateAndTime based on local rules for a geographic region. For each regional time zone, the UTC offset varies as a function of the DateAndTime, notably in support of daylight savings time changes. The UTC offset for a TimeZone also may change over time as local rules are updated for various regions and political jurisdictions.
- !TimeZone commentStamp: 'dtl 7/11/2009 15:03' prior: 0!
- TimeZone is a simple class to colect the information identifying a UTC time zone.
- Concrete subclasses are expected to implement UTC offset rules. The simple case of FixedTimeZone implements a time zone with constant offset, which is useful for unit test support.!
- offset - Duration - the time zone's offset from UTC
- abbreviation - String - the abbreviated name for the time zone.
- name - String - the name of the time zone.
- TimeZone class >> #timeZones returns an array of the known time zones
- TimeZone class >> #default returns the default time zone (Grenwich Mean Time)
- !
Item was added:
- ----- Method: TimeZone class>>allForOffset: (in category 'accessing') -----
- allForOffset: aDuration
- ^ self allTimeZones select: [:ea | ea offset = aDuration]!
Item was added:
- ----- Method: TimeZone class>>allTimeZones (in category 'accessing') -----
- allTimeZones
- "Various concrete implementations may be available. These may include a
- simple StaticTimeZone or e.g. the TZ-Olson time zone tables with daylight
- savings time offset transitions."
- ^ self allSubclasses
- inject: OrderedCollection new
- into: [ :result :cls |
- (cls class includesLocalSelector: #allTimeZones)
- ifTrue: [result addAll: cls allTimeZones].
- result].
- !
Item was changed: ----- Method: TimeZone class>>default (in category 'accessing') ----- default "Answer the default time zone - GMT"
- ^ FixedTimeZone default!
- ^ self timeZones detect: [ :tz | tz offset = Duration zero ]!
Item was removed:
- ----- Method: TimeZone class>>offset:name:abbreviation: (in category 'instance creation') -----
- offset: aDuration name: aName abbreviation: anAbbreviation
- ^ self new
- offset: aDuration;
- name: aName;
- abbreviation: anAbbreviation;
- yourself
- !
Item was removed:
- ----- Method: TimeZone class>>timeZones (in category 'accessing') -----
- timeZones
- ^{
- self offset: 0 hours name: 'Universal Time' abbreviation: 'UTC'.
- self offset: 0 hours name: 'Greenwich Mean Time' abbreviation: 'GMT'.
- self offset: 1 hours name: 'Central European Time' abbreviation: 'CET'.
- self offset: 2 hours name: 'South African Standard Time' abbreviation: 'SAST'.
- self offset: -8 hours name: 'Pacific Standard Time' abbreviation: 'PST'.
- self offset: -7 hours name: 'Mountain Standard Time' abbreviation: 'MST'.
- self offset: -6 hours name: 'Central Standard Time' abbreviation: 'CST'.
- self offset: -5 hours name: 'Eastern Standard Time' abbreviation: 'EST'.
- }!
Item was removed:
- ----- Method: TimeZone class>>timeZonesDST (in category 'accessing') -----
- timeZonesDST
- ^{
- self offset: 1 hours name: 'British Summer Time' abbreviation: 'BST'.
- self offset: 2 hours name: 'Central European Summer Time' abbreviation: 'CEST'.
- self offset: -7 hours name: 'Pacific Daylight Time' abbreviation: 'PDT'.
- self offset: -6 hours name: 'Mountain Daylight Time' abbreviation: 'MDT'.
- self offset: -5 hours name: 'Central Daylight Time' abbreviation: 'CDT'.
- self offset: -4 hours name: 'Eastern Daylight Time' abbreviation: 'EDT'.
- }!
Item was changed: ----- Method: TimeZone>>abbreviation (in category 'accessing') ----- abbreviation
- ^ self subclassResponsibility!
- ^ abbreviation!
Item was removed:
- ----- Method: TimeZone>>abbreviation: (in category 'accessing') -----
- abbreviation: aString
- abbreviation := aString!
Item was changed: ----- Method: TimeZone>>name (in category 'accessing') ----- name
- ^ self subclassResponsibility!
- ^ name!
Item was removed:
- ----- Method: TimeZone>>name: (in category 'accessing') -----
- name: aString
- name := aString!
Item was changed: ----- Method: TimeZone>>offset (in category 'accessing') ----- offset
"Answer the current offset"
^ self offsetAt: DateAndTime now
- ^ offset
!
Item was removed:
- ----- Method: TimeZone>>offset: (in category 'accessing') -----
- offset: aDuration
- offset := aDuration
- !
Item was added:
- ----- Method: TimeZone>>offsetAt: (in category 'accessing') -----
- offsetAt: dateAndTime
- ^ self subclassResponsibility
- !
Item was removed:
- ----- Method: TimeZone>>printOn: (in category 'private') -----
- printOn: aStream
- super printOn: aStream.
- aStream
- nextPut: $(;
- nextPutAll: self abbreviation;
- nextPut: $)!
Item was changed:
- (PackageInfo named: 'Chronology-Core') postscript: '"StaticTimeZone is now the concrete implementation of TimeZone"
- DateAndTime localTimeZone == TimeZone
- ifTrue: [ | newInstance |
- newInstance := StaticTimeZone
- offset: DateAndTime localTimeZone offset
- name: DateAndTime localTimeZone name
- abbreviation: DateAndTime localTimeZone abbreviation.
- DateAndTime localTimeZone: newInstance ].
- '!
- (PackageInfo named: 'Chronology-Core') postscript: 'Smalltalk removeFromStartUpList: DateAndTime'!
squeak-dev@lists.squeakfoundation.org