[squeak-dev] The Trunk: Chronology-Core-dtl.18.mcz
Levente Uzonyi
leves at caesar.elte.hu
Tue Jan 1 23:46:41 UTC 2019
Do you happen to have a stack trace?
Levente
On Tue, 1 Jan 2019, David T. Lewis wrote:
> In this case, the update process is failing on a comparison of two Date
> instances, where one of them has a start value this is an instance of
> AnObsoleteLXDateAndTime.
>
> The updater needs to be actively using DateAndTime and Date at the same
> time that I am changing their implementations. It worked fine when I
> set up a local disk-based repository update stream, but not when I
> copied it to trunk. Possibly there is something about updating from
> an HTTP repository that is different from updating from a local disk
> based MC repository.
>
> I will have to follow up on this later. If I can't figure out how to
> make the updater happy, I may need to do a one-time force-load of the
> bootstrap versions from a package postscript. That will work fine, but
> I would be happier if I could make it work as a normal part of the MCM
> update stream.
>
> Dave
>
>
> On Tue, Jan 01, 2019 at 11:30:57PM +0100, Levente Uzonyi wrote:
>> Hi Dave,
>>
>> At what point does the update fail?
>>
>> Levente
>>
>> On Tue, 1 Jan 2019, David T. Lewis wrote:
>>
>> >Sorry, I can't get this to work with the HTTP updater. I built a local
>> >repository with a completely new update stream for the UTC changes It
>> >worked locally but failed in the update process when copied to trunk.
>> >
>> >I will revert and try again another time.
>> >
>> >:-/
>> >
>> >Dave
>> >
>> >
>> >
>> >On Tue, Jan 01, 2019 at 10:18:22PM +0000, commits at source.squeak.org wrote:
>> >>David T. Lewis uploaded a new version of Chronology-Core to project The
>> >>Trunk:
>> >>http://source.squeak.org/trunk/Chronology-Core-dtl.18.mcz
>> >>
>> >>==================== Summary ====================
>> >>
>> >>Name: Chronology-Core-dtl.18
>> >>Author: dtl
>> >>Time: 1 January 2019, 2:40:33.441753 am
>> >>UUID: 0cdf2ac5-c63b-40df-9942-80916d4c7648
>> >>Ancestors: Chronology-Core-dtl.17
>> >>
>> >>Bootstrap UTCDateAndTime, step 3 of 5
>> >>
>> >>DateAndTime and TimeStamp are now inactive, having been replaced by
>> >>LXDateAndTime and LXTimeStamp. Load copies of the reimplemented
>> >>LXDateAndTime and LXTimeStamp, renamed as DateAndTime and TimeStamp, to
>> >>replace the original implementations of DateAndTime now.
>> >>
>> >>At this point, DateAndTime is an inactive copy of LXDateAndTime. The next
>> >>update will activate the new DateAndTime implementation.
>> >>
>> >>=============== Diff against Chronology-Core-dtl.17 ===============
>> >>
>> >>Item was changed:
>> >> Magnitude subclass: #DateAndTime
>> >>+ instanceVariableNames: 'utcMicroseconds localOffsetSeconds'
>> >>+ classVariableNames: 'AutomaticTimezone ClockProvider
>> >>InitializeFromPrimitive LocalTimeZone PosixEpochJulianDays'
>> >>- instanceVariableNames: 'seconds offset jdn nanos'
>> >>- classVariableNames: 'AutomaticTimezone ClockProvider LastClockValue
>> >>LocalTimeZone NanoOffset'
>> >> poolDictionaries: 'ChronologyConstants'
>> >> category: 'Chronology-Core'!
>> >>
>> >>+ !DateAndTime commentStamp: 'dtl 3/12/2016 10:32' prior: 0!
>> >>- !DateAndTime commentStamp: 'bf 2/18/2016 16:20' prior: 0!
>> >> I represent a point in UTC time as defined by ISO 8601. I have zero
>> >> duration.
>> >>
>> >>+ My implementation uses variables utcMicroseconds and
>> >>localOffsetSeconds. This represents time magnitude as elapsed
>> >>microseconds since the Posix epoch, with localOffsetSeconds representing
>> >>local offset from UTC. The magnitude is used for comparison and duration
>> >>calculations, and the local offset is used for displaying this magnitude
>> >>in the context of a local time zone.
>> >>
>> >>+ The implementation ignores leap seconds, which are adjustments made to
>> >>maintain earth rotational clock time in synchronization with elapsed
>> >>seconds.
>> >>- My implementation uses three SmallIntegers
>> >>- and a Duration:
>> >>- jdn - julian day number.
>> >>- seconds - number of seconds since midnight.
>> >>- nanos - the number of nanoseconds since the second.
>> >>
>> >>+ DateAndTime class>>now will use #primitiveUtcWithOffset to obtain
>> >>current time in UTC microseconds with current local offset in seconds.
>> >>The primitive provides an atomic query for UTC time and local offset as
>> >>measured by the OS platform. If primitiveUtcWithOffset is not available,
>> >>the traditional implementation is used, which relies on a primitive for
>> >>microseconds in the local time zone and derives UTC based on the TimeZone
>> >>setting.
>> >>- offset - duration from UTC (possibly nil if no timezone information)
>> >>-
>> >>- The nanosecond attribute is almost always zero but it defined for full
>> >>ISO compliance and is suitable for timestamping.
>> >> !
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime class>>canInitializeFromPrimitive (in
>> >>category 'system startup') -----
>> >>+ canInitializeFromPrimitive
>> >>+ "Some implementations of primitiveUtcWithOffset do not support
>> >>passing the
>> >>+ DateAndTime instance as a parameter to the primitive."
>> >>+
>> >>+ ^self basicNew initializeFromPrimitive utcMicroseconds notNil!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>date:time: (in category 'squeak
>> >> protocol') -----
>> >> date: aDate time: aTime
>> >>
>> >> ^ self
>> >>+ year: aDate year
>> >>+ month: aDate monthIndex
>> >>+ day: aDate dayOfMonth
>> >>- year: aDate year
>> >>- day: aDate dayOfYear
>> >> hour: aTime hour
>> >>+ minute: aTime minute
>> >>- minute: aTime minute
>> >> second: aTime second
>> >>+ nanoSecond: aTime nanoSecond
>> >> offset: aDate start offset!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime class>>daysFromSmalltalkEpochToPosixEpoch (in
>> >>category 'private') -----
>> >>+ daysFromSmalltalkEpochToPosixEpoch
>> >>+
>> >>+ ^52 * 365 + (17 * 366)!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>epoch (in category 'squeak protocol')
>> >> -----
>> >> epoch
>> >> "Answer a DateAndTime representing the Squeak epoch: 1 January 1901"
>> >>
>> >>+ ^ self utcMicroseconds: self epochOffsetMicros negated offset: 0
>> >>+ !
>> >>- ^ self julianDayNumber: SqueakEpoch!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime class>>epochOffset (in category 'private')
>> >>-----
>> >>+ epochOffset
>> >>+ "Elaspsed seconds from the Smalltalk epoch to the Posix epoch"
>> >>+ ^self daysFromSmalltalkEpochToPosixEpoch * SecondsInDay!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime class>>epochOffsetMicros (in category
>> >>'private') -----
>> >>+ epochOffsetMicros
>> >>+ "Elaspsed microseconds from the Smalltalk epoch to the Posix epoch"
>> >>+ ^self epochOffset * 1000000!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>fromSeconds: (in category
>> >> 'smalltalk-80') -----
>> >> fromSeconds: seconds
>> >>+ "Answer a DateAndTime since the Squeak epoch: 1 January 1901
>> >>- "Answer a DateAndTime since the Squeak epoch: 1 January 1901"
>> >>
>> >>+ Squeak traditionally used seconds since the Smalltalk epoch in local
>> >>time,
>> >>+ which is undefinable. The error was probably caused by some early VM
>> >>design
>> >>+ choices that have since been corrected. Assume now that the
>> >>Smalltalk epoch
>> >>+ is defined relative to GMT, and that it may be treated similarly to
>> >>the Posix
>> >>+ epoch except for a constant offset value.
>> >>+
>> >>+ This implementation differs from earlier Squeak in that it uses
>> >>seconds relative
>> >>+ to the Smalltalk epoch (not local time), and represents seconds as
>> >>an arbitrary
>> >>+ precision number rather than an integer."
>> >>+
>> >> ^ LXDateAndTime fromSeconds: seconds
>> >>
>> >>+ "| s uSec offset |
>> >>+ offset := self localOffsetSeconds.
>> >>+ s := seconds - self epochOffset.
>> >>+ uSec := s * 1000000.
>> >>+ ^ self utcMicroseconds: uSec offset: offset"
>> >>+ !
>> >>- "| integerSeconds nanos |
>> >>- integerSeconds := seconds truncated.
>> >>- integerSeconds = seconds
>> >>- ifTrue: [nanos := 0]
>> >>- ifFalse: [nanos := (seconds - integerSeconds *
>> >>NanosInSecond) asInteger].
>> >>- ^ self basicNew
>> >>- ticks: (Array
>> >>- with: SqueakEpoch
>> >>- with: integerSeconds
>> >>- with: nanos)
>> >>- offset: self localOffset"!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>fromUnixTime: (in category 'squeak
>> >> protocol') -----
>> >>+ fromUnixTime: utcSeconds
>> >>- fromUnixTime: aNumber
>> >>
>> >>+ ^self utcSeconds: utcSeconds offset: 0
>> >>+ !
>> >>-
>> >>- ^ self fromSeconds: aNumber + self unixEpoch asSeconds!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>initialize (in category
>> >> 'initialize-release') -----
>> >> initialize
>> >>+
>> >>+ super initialize.
>> >>+
>> >>+ ClockProvider := Time.
>> >>+ PosixEpochJulianDays := 2440588.
>> >>+ InitializeFromPrimitive := self canInitializeFromPrimitive.
>> >>+ Smalltalk addToStartUpList: self.
>> >>+ self startUp: true
>> >>- ClockProvider ifNil: [ClockProvider := Time].
>> >>- Smalltalk addToStartUpList: self after: Delay.
>> >>- self startUp: true.
>> >> !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>julianDayNumber:offset: (in category
>> >> 'squeak protocol') -----
>> >> julianDayNumber: anInteger offset: aDuration
>> >>
>> >> ^ LXDateAndTime julianDayNumber: anInteger offset: aDuration
>> >>
>> >> "^self basicNew
>> >> setJdn: anInteger
>> >> seconds: 0
>> >> nano: 0
>> >> offset: aDuration"!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>localOffset (in category 'squeak
>> >> protocol') -----
>> >> localOffset
>> >> "Answer the duration we are offset from UTC"
>> >>
>> >>+ ^ Duration seconds: self localOffsetSeconds
>> >>- ^ self localTimeZone offset
>> >> !
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime class>>localOffsetSeconds (in category
>> >>'private') -----
>> >>+ localOffsetSeconds
>> >>+
>> >>+ self automaticTimezone
>> >>+ ifTrue: [ ^Time posixMicrosecondClockWithOffset second ]
>> >>+ ifFalse: [ ^self localTimeZone offset asSeconds ]!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>new (in category 'squeak protocol')
>> >> -----
>> >> new
>> >> "Answer a DateAndTime representing the Squeak epoch: 1 January 1901"
>> >>
>> >>+ ^ self utcMicroseconds: self epochOffsetMicros negated offset: 0
>> >>+
>> >>+ !
>> >>- ^ self epoch!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>now (in category 'ansi protocol') -----
>> >> now
>> >>+ "Answer time now as reported by #primitiveUtcWithOffset. If the
>> >>primitive is not
>> >>+ available, answer the Posix epoch GMT."
>> >>
>> >> ^LXDateAndTime now.
>> >>
>> >>+ "self automaticTimezone
>> >>+ ifTrue: [ InitializeFromPrimitive
>> >>+ ifTrue: [ ^ self basicNew initializeFromPrimitive ]
>> >>+ ifFalse: [ | timeArray |
>> >>+ timeArray := Time
>> >>posixMicrosecondClockWithOffset.
>> >>+ ^ self utcMicroseconds: timeArray first
>> >>offset: timeArray second ] ]
>> >>+ ifFalse: [ | timeArray |
>> >>+ timeArray := Time posixMicrosecondClockWithOffset.
>> >>+ ^ self utcMicroseconds: timeArray first offset: self
>> >>localOffsetSeconds ]"
>> >>+ !
>> >>- "| clockAndOffset localSeconds |
>> >>- clockAndOffset := self clock utcMicrosecondClockWithOffset.
>> >>- localSeconds := self localOffset asSeconds.
>> >>- (self automaticTimezone and: [localSeconds ~= clockAndOffset second])
>> >>- ifTrue: [self setLocalOffsetAutomatically: (Duration
>> >>seconds: (localSeconds := clockAndOffset second))].
>> >>- ^self now: clockAndOffset first + (localSeconds * 1000000) offset:
>> >>self localOffset"!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>nowAtOffset: (in category 'squeak
>> >> protocol') -----
>> >> nowAtOffset: offsetDuration
>> >> "Answers the local time at places with the specified offsetDuration
>> >> timezone."
>> >> "local time Chicago (CST)"
>> >> "DateAndTime nowAtOffset: -6 hours"
>> >>+
>> >>+ ^ self utcMicroseconds: Time posixMicrosecondClockWithOffset first
>> >>offset: offsetDuration asSeconds
>> >>+ !
>> >>- ^ self now + (offsetDuration - self localOffset) offset:
>> >>offsetDuration!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime class>>nowWithOffset: (in category 'squeak
>> >>protocol') -----
>> >>+ nowWithOffset: aDuration
>> >>+ "Answer time now as reported by #primitiveUtcWithOffset. If the
>> >>primitive is not
>> >>+ available, answer the Posix epoch with time zone offset aDuration."
>> >>+
>> >>+ | timeArray |
>> >>+ timeArray := Time posixMicrosecondClockWithOffset.
>> >>+ ^ self utcMicroseconds: timeArray first offset: aDuration asSeconds
>> >>+ !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>readFrom: (in category 'squeak
>> >> protocol') -----
>> >> readFrom: aStream
>> >>
>> >>+ | offsetSeconds ch yearMonthDay hourMinuteSecondNano offset |
>> >>- | offset date time ch |
>> >>
>> >>+ yearMonthDay := Date readYearMonthDayFrom: aStream.
>> >>- date := Date readFrom: aStream.
>> >> [aStream peek isDigit]
>> >> whileFalse: [aStream next].
>> >>+ hourMinuteSecondNano := Time readHourMinuteSecondNanoFrom: aStream.
>> >>- time := Time readFrom: aStream.
>> >> (aStream atEnd or: [('+-Z' includes: aStream peek) not])
>> >>+ ifTrue: [ self flag: #FIXME.
>> >>+ "Different unit tests have conflicting
>> >>opinions as to whether the
>> >>+ current local offset should be used as a
>> >>default. However, the current
>> >>+ local offset cannot be correct due to DST
>> >>(offset is itself a function
>> >>+ of the point in time). Nevertheless, this is
>> >>a reasonable default considering
>> >>+ that the offset would have been explicitly
>> >>part of the date string if it
>> >>+ was a matter of concern. Unit tests will
>> >>require updates to match this
>> >>+ assumption."
>> >>+ "offsetSeconds := 0"
>> >>+ offsetSeconds := self localOffsetSeconds]
>> >>- ifTrue: [offset := self localOffset]
>> >> ifFalse: [(aStream peekFor: $Z)
>> >>+ ifTrue: [offsetSeconds := 0]
>> >>- ifTrue: [offset := Duration zero]
>> >> ifFalse: [
>> >> ch := aStream next.
>> >> ch = $+ ifTrue: [ch := Character space].
>> >>+ offset := Duration fromString: ch asString,
>> >>'0:', aStream upToEnd, ':0'.
>> >>+ offsetSeconds := offset asSeconds]].
>> >>- offset := Duration fromString: ch asString,
>> >>'0:', aStream upToEnd, ':0']].
>> >> ^ self
>> >>+ year: yearMonthDay first
>> >>+ month: yearMonthDay second
>> >>+ day: yearMonthDay third
>> >>+ hour: hourMinuteSecondNano first
>> >>+ minute: hourMinuteSecondNano second
>> >>+ second: hourMinuteSecondNano third
>> >>+ nanoSecond: hourMinuteSecondNano fourth
>> >>+ offsetSeconds: offsetSeconds
>> >>- year: date year
>> >>- month: date monthIndex
>> >>- day: date dayOfMonth
>> >>- hour: time hour
>> >>- minute: time minute
>> >>- second: time second
>> >>- nanoSecond: time nanoSecond
>> >>- offset: offset
>> >>
>> >>
>> >> " '-1199-01-05T20:33:14.321-05:00' asDateAndTime
>> >> ' 2002-05-16T17:20:45.1+01:01' asDateAndTime
>> >>
>> >> ' 2002-05-16T17:20:45.02+01:01' asDateAndTime
>> >>
>> >> ' 2002-05-16T17:20:45.003+01:01' asDateAndTime
>> >>
>> >> ' 2002-05-16T17:20:45.0004+01:01' asDateAndTime
>> >> ' 2002-05-16T17:20:45.00005' asDateAndTime
>> >> ' 2002-05-16T17:20:45.000006+01:01' asDateAndTime
>> >>
>> >> ' 2002-05-16T17:20:45.0000007+01:01' asDateAndTime
>> >> ' 2002-05-16T17:20:45.00000008-01:01' asDateAndTime
>> >> ' 2002-05-16T17:20:45.000000009+01:01' asDateAndTime
>> >> ' 2002-05-16T17:20:45.0000000001+01:01' asDateAndTime
>> >>
>> >> ' 2002-05-16T17:20' asDateAndTime
>> >> ' 2002-05-16T17:20:45' asDateAndTime
>> >> ' 2002-05-16T17:20:45+01:57' asDateAndTime
>> >> ' 2002-05-16T17:20:45-02:34' asDateAndTime
>> >> ' 2002-05-16T17:20:45+00:00' asDateAndTime
>> >> ' 1997-04-26T01:02:03+01:02:3' asDateAndTime
>> >> "!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime class>>startUp: (in category 'system
>> >> startup') -----
>> >> startUp: startingAfresh
>> >> "Set local timezone"
>> >>+ startingAfresh
>> >>+ ifTrue: [InitializeFromPrimitive := self
>> >>canInitializeFromPrimitive.
>> >>+ Time initialize. "set LastClockTick to 0".
>> >>+ self now.
>> >>+ self automaticTimezone]!
>> >>- startingAfresh & self automaticTimezone ifTrue: [self now].
>> >>- !
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime class>>utcMicroseconds:offset: (in category
>> >>'instance creation') -----
>> >>+ utcMicroseconds: microsecondsSincePosixEpoch offset: secondsFromGMT
>> >>+
>> >>+ ^super new
>> >>+ utcMicroseconds: microsecondsSincePosixEpoch
>> >>+ offset: secondsFromGMT!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime
>> >>class>>utcMicrosecondsForYear:month:day:hour:minute:second:nanoSecond:offsetSeconds: (in category 'private') -----
>> >>+ utcMicrosecondsForYear: year month: month day: day hour: hour minute:
>> >>minute second: second nanoSecond: nanoCount offsetSeconds: offsetSeconds
>> >>+
>> >>+ | monthIndex daysInMonth p q r s julianDayNumber posixDays seconds
>> >>utcSeconds |
>> >>+
>> >>+ monthIndex := month isInteger ifTrue: [month] ifFalse: [Month
>> >>indexOfMonth: month].
>> >>+ daysInMonth := Month
>> >>+ daysInMonth: monthIndex
>> >>+ forYear: year.
>> >>+ day < 1 ifTrue: [self error: 'day may not be zero or negative'].
>> >>+ day > daysInMonth ifTrue: [self error: 'day is after month ends'].
>> >>+
>> >>+ p := (monthIndex - 14) quo: 12.
>> >>+ q := year + 4800 + p.
>> >>+ r := monthIndex - 2 - (12 * p).
>> >>+ s := (year + 4900 + p) quo: 100.
>> >>+
>> >>+ julianDayNumber :=
>> >>+ ( (1461 * q) quo: 4 ) +
>> >>+ ( (367 * r) quo: 12 ) -
>> >>+ ( (3 * s) quo: 4 ) +
>> >>+ ( day - 32075 ).
>> >>+
>> >>+ posixDays := julianDayNumber - PosixEpochJulianDays.
>> >>+ seconds := hour * 60 + minute * 60 + second - offsetSeconds.
>> >>+ utcSeconds := seconds + (posixDays * 24 * 3600).
>> >>+ ^ utcSeconds * 1000000 + (nanoCount / 1000)
>> >>+ !
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime class>>utcSeconds:offset: (in category
>> >>'instance creation') -----
>> >>+ utcSeconds: secondsSincePosixEpoch offset: secondsFromGMT
>> >>+
>> >>+ ^self
>> >>+ utcMicroseconds: secondsSincePosixEpoch * 1000000
>> >>+ offset: secondsFromGMT!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime
>> >> class>>year:month:day:hour:minute:second:nanoSecond:offset: (in
>> >> category 'squeak protocol') -----
>> >> year: year month: month day: day hour: hour minute: minute second:
>> >> second nanoSecond: nanoCount offset: offset
>> >> "Return a DateAndTime"
>> >>
>> >>+ ^ LXDateAndTime year: year month: month day: day hour: hour minute:
>> >>minute second: second nanoSecond: nanoCount offset: offset
>> >>- | monthIndex daysInMonth p q r s julianDayNumber |
>> >>
>> >>+ "| offsetSeconds utcMicros |
>> >>+ offsetSeconds := offset asSeconds.
>> >>+ utcMicros := self
>> >>+ utcMicrosecondsForYear: year
>> >>+ month: month
>> >>+ day: day
>> >>+ hour: hour
>> >>+ minute: minute
>> >>+ second: second
>> >>+ nanoSecond: nanoCount
>> >>+ offsetSeconds: offsetSeconds.
>> >>+ ^ self utcMicroseconds: utcMicros offset: offsetSeconds"!
>> >>- monthIndex := month isInteger ifTrue: [month] ifFalse: [Month
>> >>indexOfMonth: month].
>> >>- daysInMonth := Month
>> >>- daysInMonth: monthIndex
>> >>- forYear: year.
>> >>- day < 1 ifTrue: [self error: 'day may not be zero or negative'].
>> >>- day > daysInMonth ifTrue: [self error: 'day is after month ends'].
>> >>-
>> >>- p := (monthIndex - 14) quo: 12.
>> >>- q := year + 4800 + p.
>> >>- r := monthIndex - 2 - (12 * p).
>> >>- s := (year + 4900 + p) quo: 100.
>> >>-
>> >>- julianDayNumber :=
>> >>- ( (1461 * q) quo: 4 ) +
>> >>- ( (367 * r) quo: 12 ) -
>> >>- ( (3 * s) quo: 4 ) +
>> >>- ( day - 32075 ).
>> >>-
>> >>- ^self basicNew
>> >>- setJdn: julianDayNumber
>> >>- seconds: hour * 60 + minute * 60 + second
>> >>- nano: nanoCount
>> >>- offset: offset;
>> >>- yourself!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime
>> >>class>>year:month:day:hour:minute:second:nanoSecond:offsetSeconds: (in
>> >>category 'squeak protocol') -----
>> >>+ year: year month: month day: day hour: hour minute: minute second:
>> >>second nanoSecond: nanoCount offsetSeconds: offsetSeconds
>> >>+ "Return a DateAndTime"
>> >>+
>> >>+ | utcMicros |
>> >>+ utcMicros := self
>> >>+ utcMicrosecondsForYear: year
>> >>+ month: month
>> >>+ day: day
>> >>+ hour: hour
>> >>+ minute: minute
>> >>+ second: second
>> >>+ nanoSecond: nanoCount
>> >>+ offsetSeconds: offsetSeconds.
>> >>+ ^ self utcMicroseconds: utcMicros offset: offsetSeconds!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>+ (in category 'ansi protocol') -----
>> >> + operand
>> >> "operand conforms to protocol Duration"
>> >>
>> >>+ ^ self class
>> >>+ utcMicroseconds: operand asDuration asNanoSeconds / 1000 +
>> >>utcMicroseconds
>> >>+ offset: localOffsetSeconds
>> >>- | ticks |
>> >>- ticks := self ticks + (operand asDuration ticks) .
>> >>-
>> >>- ^ self class basicNew
>> >>- ticks: ticks
>> >>- offset: self offset;
>> >>- yourself
>> >> !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>- (in category 'ansi protocol') -----
>> >> - operand
>> >> "operand conforms to protocol DateAndTime or protocol Duration"
>> >>
>> >> ^ (operand respondsTo: #asDateAndTime)
>> >> ifTrue:
>> >>+ [ | micros |
>> >>+ micros := utcMicroseconds - operand asDateAndTime
>> >>utcMicroseconds.
>> >>+ Duration seconds: micros // 1000000 nanoSeconds:
>> >>micros \\ 1000000 * 1000]
>> >>+ ifFalse:
>> >>+ [ self + (operand negated) ]
>> >>- [ | lticks rticks |
>> >>- lticks := self asLocal ticks.
>> >>-
>> >>- rticks := operand asDateAndTime asLocal ticks.
>> >>- Duration
>> >>- seconds: (SecondsInDay *(lticks first -
>> >>rticks first)) + - (lticks
>> >>second - rticks second)
>> >>- nanoSeconds: (lticks third - rticks third) ]
>> >>-
>> >>- ifFalse:
>> >>-
>> >>- [ self + (operand negated) ]
>> >> !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>< (in category 'ansi protocol') -----
>> >>+ < comparand
>> >>- < comparand
>> >> "comparand conforms to protocol DateAndTime,
>> >> or can be converted into something that conforms."
>> >>+
>> >>+ ^utcMicroseconds < comparand asDateAndTime utcMicroseconds
>> >>+ !
>> >>- | lvalue rvalue comparandAsDateAndTime |
>> >>- comparandAsDateAndTime := comparand asDateAndTime.
>> >>- self offset = comparandAsDateAndTime offset
>> >>- ifTrue:
>> >>- [ lvalue := self.
>> >>- rvalue := comparandAsDateAndTime ]
>> >>- ifFalse:
>> >>- [ lvalue := self asUTC.
>> >>- rvalue := comparandAsDateAndTime asUTC ].
>> >>- ^ lvalue julianDayNumber < rvalue julianDayNumber or:
>> >>- [ lvalue julianDayNumber > rvalue julianDayNumber
>> >>- ifTrue: [ false ]
>> >>- ifFalse:
>> >>- [ lvalue secondsSinceMidnight < rvalue
>> >>secondsSinceMidnight or:
>> >>- [ lvalue secondsSinceMidnight >
>> >>rvalue secondsSinceMidnight
>> >>- ifTrue: [ false ]
>> >>- ifFalse: [ lvalue nanoSecond
>> >>< rvalue nanoSecond ] ] ] ]!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>= (in category 'ansi protocol') -----
>> >>+ = aDateAndTimeOrTimeStamp
>> >>+ "Equal if the absolute time values match, regardless of local time
>> >>transform"
>> >>- = aDateAndTimeOrTimeStamp
>> >> self == aDateAndTimeOrTimeStamp ifTrue: [ ^ true ].
>> >>+ ^aDateAndTimeOrTimeStamp species == DateAndTime
>> >>+ and: [ utcMicroseconds = aDateAndTimeOrTimeStamp
>> >>utcMicroseconds ]!
>> >>- ((aDateAndTimeOrTimeStamp isKindOf: self class)
>> >>- or: [aDateAndTimeOrTimeStamp isKindOf: DateAndTime orOf:
>> >>TimeStamp])
>> >>- ifFalse: [ ^ false ].
>> >>- ^ self offset = aDateAndTimeOrTimeStamp offset
>> >>- ifTrue: [ self hasEqualTicks: aDateAndTimeOrTimeStamp ]
>> >>- ifFalse: [ self asUTC hasEqualTicks: aDateAndTimeOrTimeStamp
>> >>asUTC ]!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>asChronologySeconds (in category
>> >>'converting') -----
>> >>+ asChronologySeconds
>> >>+ "What #asSeconds answers in prior Chronology-format images."
>> >>+ ^ self asSeconds + self offset asSeconds!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>asDuration (in category 'squeak protocol')
>> >> -----
>> >> asDuration
>> >> "Answer the duration since midnight."
>> >>
>> >>+ ^ Duration seconds: self getSeconds nanoSeconds: self nanoSecond
>> >>- ^ Duration seconds: seconds nanoSeconds: nanos
>> >> !
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>asExactSeconds (in category 'smalltalk-80')
>> >>-----
>> >>+ asExactSeconds
>> >>+ "Return the duration in seconds since the Squeak epoch"
>> >>+
>> >>+ "Squeak traditionally used seconds since the Smalltalk epoch in
>> >>local time,
>> >>+ which is undefinable. The error was probably caused by some early VM
>> >>design
>> >>+ choices that have since been corrected. Assume now that the
>> >>Smalltalk epoch
>> >>+ is defined relative to GMT, and that it may be treated similarly to
>> >>the Posix
>> >>+ epoch except for a constant offset value.
>> >>+
>> >>+ This implementation differs from earlier Squeak in that it uses
>> >>seconds relative
>> >>+ to the Smalltalk epoch (not local time), and represents seconds as
>> >>an arbitrary
>> >>+ precision number rather than an integer."
>> >>+
>> >>+ ^ utcMicroseconds / 1000000 + self class epochOffset
>> >>+ !
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>asPosixSeconds (in category 'converting')
>> >>-----
>> >>+ asPosixSeconds
>> >>+
>> >>+ ^utcMicroseconds / 1000000
>> >>+ !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>asSeconds (in category 'smalltalk-80') -----
>> >> asSeconds
>> >>+ "Return the number of seconds since the Squeak epoch. See
>> >>asExactSeconds
>> >>+ to retain full precision of the duration in seconds."
>> >>+
>> >>+ "Squeak traditionally used seconds since the Smalltalk epoch in
>> >>local time,
>> >>+ which is undefinable. The error was probably caused by some early VM
>> >>design
>> >>+ choices that have since been corrected. Assume now that the
>> >>Smalltalk epoch
>> >>+ is defined relative to GMT, and that it may be treated similarly to
>> >>the Posix
>> >>+ epoch except for a constant offset value.
>> >>+
>> >>+ This implementation differs from earlier Squeak in that it uses
>> >>seconds relative
>> >>+ to the Smalltalk epoch (not local time), and represents seconds as
>> >>an arbitrary
>> >>+ precision number rather than an integer."
>> >>+
>> >>+ ^ utcMicroseconds // 1000000 + self class epochOffset
>> >>+ !
>> >>- "Return the number of seconds since the Squeak epoch"
>> >>- ^ (self - (self class epoch offset: offset)) asSeconds!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>asTime (in category 'squeak protocol') -----
>> >> asTime
>> >>
>> >>
>> >>+ ^ Time seconds: self getSeconds nanoSeconds: self nanoSecond
>> >>- ^ Time seconds: seconds nanoSeconds: nanos
>> >> !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>asTimeStamp (in category 'squeak protocol')
>> >> -----
>> >> asTimeStamp
>> >>
>> >>+ ^ self
>> >>+ asDateAndTime "FIXME LX hack for test support"
>> >>+ as: TimeStamp!
>> >>- ^ self as: TimeStamp!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>asUTC (in category 'ansi protocol') -----
>> >> asUTC
>> >>
>> >>+ localOffsetSeconds = 0 ifTrue: [ ^self ].
>> >>+ ^self copy
>> >>+ utcMicroseconds: utcMicroseconds
>> >>+ offset: 0
>> >>- ^ self offset isZero
>> >>- ifTrue: [self]
>> >>- ifFalse: [self utcOffset: 0]
>> >> !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>dayMonthYearDo: (in category 'squeak
>> >> protocol') -----
>> >> dayMonthYearDo: aBlock
>> >> "Evaluation the block with three arguments: day month, year."
>> >>
>> >> | l n i j dd mm yyyy |
>> >>+ l := self julianDayNumber + 68569.
>> >>- l := jdn + 68569.
>> >> n := 4 * l // 146097.
>> >> l := l - (146097 * n + 3 // 4).
>> >> i := 4000 * (l + 1) // 1461001.
>> >> l := l - (1461 * i // 4) + 31.
>> >> j := 80 * l // 2447.
>> >> dd := l - (2447 * j // 80).
>> >> l := j // 11.
>> >> mm := j + 2 - (12 * l).
>> >> yyyy := 100 * (n - 49) + i + l.
>> >>
>> >> ^ aBlock
>> >> value: dd
>> >> value: mm
>> >> value: yyyy!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>dayOfWeek (in category 'ansi protocol') -----
>> >> dayOfWeek
>> >>
>> >> "Sunday=1, ... , Saturday=7"
>> >>
>> >>+ ^ (self julianDayNumber + 1 rem: 7) + 1
>> >>- ^ (jdn + 1 rem: 7) + 1
>> >> !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>floor (in category 'squeak protocol') -----
>> >> floor
>> >> "Answer a copy with magnitude rounded down to the nearest whole
>> >> second"
>> >>+ ^self class
>> >>+ utcMicroseconds: utcMicroseconds - (utcMicroseconds \\
>> >>1000000)
>> >>+ offset: localOffsetSeconds!
>> >>- ^self class basicNew
>> >>- ticks: (self ticks at: 3 put: 0; yourself)
>> >>- offset: offset.
>> >>- !
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>getSeconds (in category 'accessing') -----
>> >>+ getSeconds
>> >>+
>> >>+ | posixDays posixSeconds localSeconds |
>> >>+ posixSeconds := utcMicroseconds // 1000000.
>> >>+ localSeconds := posixSeconds + localOffsetSeconds.
>> >>+ localSeconds < 0 ifTrue: [localSeconds := localSeconds \\
>> >>SecondsInDay]. "normalize"
>> >>+ posixDays := localSeconds // SecondsInDay.
>> >>+ ^localSeconds - (posixDays * SecondsInDay).
>> >>+ !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>hash (in category 'ansi protocol') -----
>> >> hash
>> >>+ ^utcMicroseconds hash!
>> >>- | totalSeconds |
>> >>- totalSeconds := seconds - self offset asSeconds.
>> >>- ^ ((totalSeconds // 86400 + jdn) hashMultiply bitXor: totalSeconds \\
>> >>- 86400) bitXor: nanos!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>hour24 (in category 'ansi protocol') -----
>> >> hour24
>> >>
>> >>+ ^self getSeconds // 3600!
>> >>-
>> >>- ^ (Duration seconds: seconds) hours!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>initializeFromPrimitive (in category
>> >>'initialize-release') -----
>> >>+ initializeFromPrimitive
>> >>+
>> >>+ Time posixMicrosecondClockWithOffset: self!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>julianDayNumber (in category 'squeak
>> >> protocol') -----
>> >> julianDayNumber
>> >>
>> >>+ | posixDays posixSeconds localSeconds negativeDays |
>> >>+ posixSeconds := utcMicroseconds // 1000000.
>> >>+ localSeconds := posixSeconds + localOffsetSeconds.
>> >>+ negativeDays := 0.
>> >>+ localSeconds < 0 ifTrue: [ "normalize"
>> >>+ negativeDays := localSeconds // SecondsInDay.
>> >>+ localSeconds := negativeDays * SecondsInDay +
>> >>localSeconds].
>> >>+ posixDays := localSeconds // SecondsInDay.
>> >>+ ^posixDays + PosixEpochJulianDays - negativeDays.
>> >>+ !
>> >>-
>> >>- ^ jdn!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>localOffsetSeconds: (in category
>> >>'initialize-release') -----
>> >>+ localOffsetSeconds: seconds
>> >>+ "Private. Allow value to be modified during initialization in order
>> >>to support local
>> >>+ timezone preference."
>> >>+
>> >>+ localOffsetSeconds := seconds
>> >>+ !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>makeUTC (in category 'squeak protocol') -----
>> >> makeUTC
>> >> "Make the receiver's timezone UTC."
>> >>+ localOffsetSeconds := 0!
>> >>- self primOffset: Duration zero!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>microsecondsFromDay:seconds:nanos:offset:
>> >>(in category 'private') -----
>> >>+ microsecondsFromDay: jdn seconds: s nanos: n offset: localOffsetSeconds
>> >>+
>> >>+ | days totalSeconds micros |
>> >>+ days := jdn - PosixEpochJulianDays.
>> >>+ totalSeconds := days * 86400 + s - localOffsetSeconds. "n.g. const
>> >>86400 is faster than SecondsInDay"
>> >>+ micros := totalSeconds * 1000000.
>> >>+ ^micros + (n / 1000)
>> >>+ !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>midnight (in category 'squeak protocol')
>> >> -----
>> >> midnight
>> >> "Answer a DateAndTime starting at midnight of the same timezone
>> >> offset as the receiver."
>> >> ^ self class basicNew
>> >>+ setJdn: self julianDayNumber
>> >>+ seconds: localOffsetSeconds
>> >>- setJdn: jdn
>> >>- seconds: 0
>> >> nano: 0
>> >>+ localOffsetSeconds: localOffsetSeconds.!
>> >>- offset: offset!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>minute (in category 'ansi protocol') -----
>> >> minute
>> >>
>> >>+ ^self getSeconds // 60 \\ 60!
>> >>-
>> >>- ^ (Duration seconds: seconds) minutes!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>nanoSecond (in category 'squeak protocol')
>> >> -----
>> >> nanoSecond
>> >>
>> >>+ ^utcMicroseconds \\ 1000000 * 1000
>> >>+ !
>> >>-
>> >>- ^ nanos!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>normalize:ticks:base: (in category
>> >> 'private') -----
>> >> normalize: i ticks: ticks base: base
>> >>
>> >> | tick div quo rem |
>> >> tick := ticks at: i.
>> >>+ div := tick asInteger digitDiv: base neg: tick negative.
>> >>- div := tick digitDiv: base neg: tick negative.
>> >> quo := (div at: 1) normalize.
>> >> rem := (div at: 2) normalize.
>> >> rem < 0 ifTrue: [ quo := quo - 1. rem := base + rem ].
>> >> ticks at: (i-1) put: ((ticks at: i-1) + quo).
>> >> ticks at: i put: rem
>> >> !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>offset (in category 'ansi protocol') -----
>> >> offset
>> >>
>> >>+ ^ Duration seconds: localOffsetSeconds!
>> >>- ^ offset ifNil: [Duration zero]!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>offset: (in category 'ansi protocol') -----
>> >> offset: anOffset
>> >>
>> >> "Answer a <DateAndTime> equivalent to the receiver but with its
>> >> local time
>> >> being offset from UTC by offset."
>> >>
>> >>+ | newOffset newMicros |
>> >>+ self flag: #FIXME. "check the definition of this and of #utcOffset:"
>> >>+ newOffset := anOffset asDuration asSeconds.
>> >>+ newMicros := localOffsetSeconds - newOffset * 1000000 +
>> >>utcMicroseconds.
>> >>+ ^ self class utcMicroseconds: newMicros offset: newOffset
>> >>+ !
>> >>- ^ self class basicNew
>> >>- ticks: self ticks offset: (anOffset ifNotNil: [anOffset
>> >>asDuration]);
>> >>- yourself!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>offsetSeconds (in category 'accessing') -----
>> >>+ offsetSeconds
>> >>+
>> >>+ ^localOffsetSeconds!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>posixEpochJulianDays (in category
>> >>'initialize-release') -----
>> >>+ posixEpochJulianDays
>> >>+
>> >>+ ^self class daysFromSmalltalkEpochToPosixEpoch + SqueakEpoch!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>printHMSOn: (in category 'squeak protocol')
>> >> -----
>> >> printHMSOn: aStream
>> >> "Print just hh:mm:ss"
>> >>+
>> >>+ | seconds |
>> >>+ seconds := self getSeconds.
>> >>+ seconds // 3600 printOn: aStream base: 10 length: 2 padded: true.
>> >>+ aStream nextPut: $:.
>> >>+ seconds \\ 3600 // 60 printOn: aStream base: 10 length: 2 padded:
>> >>true.
>> >>+ aStream nextPut: $:.
>> >>+ seconds \\ 60 printOn: aStream base: 10 length: 2 padded: true!
>> >>- aStream
>> >>- nextPutAll: (self hour asString padded: #left to: 2 with:
>> >>$0);
>> >>- nextPut: $:;
>> >>- nextPutAll: (self minute asString padded: #left to: 2 with:
>> >>$0);
>> >>- nextPut: $:;
>> >>- nextPutAll: (self second asString padded: #left to: 2 with:
>> >>$0).
>> >>- !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>printOn:withLeadingSpace: (in category
>> >> 'squeak protocol') -----
>> >> printOn: aStream withLeadingSpace: printLeadingSpaceToo
>> >> "Print as per ISO 8601 sections 5.3.3 and 5.4.1.
>> >> If printLeadingSpaceToo is false, prints either:
>> >> 'YYYY-MM-DDThh:mm:ss.s+ZZ:zz:z' (for positive years) or
>> >> '-YYYY-MM-DDThh:mm:ss.s+ZZ:zz:z' (for negative years)
>> >> If printLeadingSpaceToo is true, prints either:
>> >> ' YYYY-MM-DDThh:mm:ss.s+ZZ:zz:z' (for positive years) or
>> >> '-YYYY-MM-DDThh:mm:ss.s+ZZ:zz:z' (for negative years)
>> >> "
>> >>
>> >>+ | nanos offsetSeconds |
>> >> self printYMDOn: aStream withLeadingSpace: printLeadingSpaceToo.
>> >> aStream nextPut: $T.
>> >> self printHMSOn: aStream.
>> >>+ (nanos := utcMicroseconds \\ 1000000 * 1000) = 0 ifFalse: [
>> >>+ | length |
>> >>+ aStream nextPut: $..
>> >>+ length := 9.
>> >>+ [ nanos \\ 10 = 0 ] whileTrue: [
>> >>+ nanos := nanos // 10.
>> >>+ length := length - 1 ].
>> >>+ nanos printOn: aStream base: 10 length: length padded: true
>> >>].
>> >>+ "Print offset"
>> >>+ aStream nextPut: (localOffsetSeconds >= 0 ifTrue: [ $+ ] ifFalse: [
>> >>$- ]).
>> >>+ offsetSeconds := localOffsetSeconds abs.
>> >>+ offsetSeconds // 3600 printOn: aStream base: 10 length: 2 padded:
>> >>true.
>> >>+ aStream nextPut: $:.
>> >>+ offsetSeconds \\ 3600 // 60 printOn: aStream base: 10 length: 2
>> >>padded: true.
>> >>+ (offsetSeconds := offsetSeconds \\ 60) = 0 ifFalse: [
>> >>+ aStream
>> >>- self nanoSecond ~= 0 ifTrue:
>> >>- [ | z ps |
>> >>- ps := self nanoSecond printString padded: #left to: 9 with:
>> >>$0.
>> >>- z := ps findLast: [ :c | c asciiValue > $0 asciiValue ].
>> >>- (z > 0) ifTrue: [aStream nextPut: $.].
>> >>- ps from: 1 to: z do: [ :c | aStream nextPut: c ] ].
>> >>- aStream
>> >>- nextPut: (self offset positive ifTrue: [$+] ifFalse: [$-]);
>> >>- nextPutAll: (self offset hours abs asString padded: #left
>> >>to: 2 with: $0);
>> >>- nextPut: $:;
>> >>- nextPutAll: (self offset minutes abs asString padded: #left
>> >>to: 2 with: $0).
>> >>- self offset seconds = 0 ifFalse:
>> >>- [ aStream
>> >> nextPut: $:;
>> >>+ print: offsetSeconds ]!
>> >>- nextPutAll: (self offset seconds abs truncated
>> >>asString) ].
>> >>- !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>printYMDOn:withLeadingSpace: (in category
>> >> 'squeak protocol') -----
>> >> printYMDOn: aStream withLeadingSpace: printLeadingSpaceToo
>> >> "Print just the year, month, and day on aStream.
>> >>
>> >> If printLeadingSpaceToo is true, then print as:
>> >> ' YYYY-MM-DD' (if the year is positive) or '-YYYY-MM-DD' (if
>> >> the year is negative)
>> >> otherwise print as:
>> >> 'YYYY-MM-DD' or '-YYYY-MM-DD' "
>> >>
>> >>+ self dayMonthYearDo: [ :day :month :year |
>> >>+ year negative
>> >>+ ifTrue: [ aStream nextPut: $- ]
>> >>+ ifFalse: [ printLeadingSpaceToo ifTrue: [ aStream
>> >>space ] ].
>> >>+ year abs printOn: aStream base: 10 length: 4 padded: true.
>> >>+ aStream nextPut: $-.
>> >>+ month printOn: aStream base: 10 length: 2 padded: true.
>> >>+ aStream nextPut: $-.
>> >>+ day printOn: aStream base: 10 length: 2 padded: true ]!
>> >>- | year month day |
>> >>- self dayMonthYearDo: [ :d :m :y | year := y. month := m. day := d ].
>> >>- year negative
>> >>- ifTrue: [ aStream nextPut: $- ]
>> >>- ifFalse: [ printLeadingSpaceToo ifTrue: [ aStream space ]].
>> >>- aStream
>> >>- nextPutAll: (year abs asString padded: #left to: 4 with: $0);
>> >>- nextPut: $-;
>> >>- nextPutAll: (month asString padded: #left to: 2 with: $0);
>> >>- nextPut: $-;
>> >>- nextPutAll: (day asString padded: #left to: 2 with: $0)
>> >>- !
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>readDataFrom:size: (in category 'objects
>> >>from disk') -----
>> >>+ readDataFrom: aDataStream size: varsOnDisk
>> >>+ "Fill in the fields of self based on the contents of aDataStream.
>> >>The serialized
>> >>+ data will have four instance variables, because all instances are
>> >>serialized in a
>> >>+ cononical format as if having originating from an instance with the
>> >>traditional
>> >>+ seconds/offset/jdn/nanos instance variables."
>> >>+
>> >>+ | seconds offset jdn nanos |
>> >>+ seconds := aDataStream next.
>> >>+ offset := aDataStream next.
>> >>+ jdn := aDataStream next.
>> >>+ nanos := aDataStream next.
>> >>+ localOffsetSeconds := offset ifNil: [ 0 ] ifNotNil: [ :off | off
>> >>asSeconds ].
>> >>+ utcMicroseconds := self
>> >>+ microsecondsFromDay: jdn
>> >>+ seconds: seconds
>> >>+ nanos: nanos
>> >>+ offset: localOffsetSeconds.!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>second (in category 'ansi protocol') -----
>> >> second
>> >>
>> >>+ ^self getSeconds \\ 60!
>> >>-
>> >>- ^ (Duration seconds: seconds) seconds!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>secondsSinceMidnight (in category 'private')
>> >> -----
>> >> secondsSinceMidnight
>> >>
>> >>+ ^ self getSeconds!
>> >>- ^ seconds!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>setJdn:seconds:nano:localOffsetSeconds: (in
>> >>category 'private') -----
>> >>+ setJdn: jdn seconds: s nano: n localOffsetSeconds: offset
>> >>+
>> >>+ localOffsetSeconds := offset.
>> >>+ utcMicroseconds := self
>> >>+ microsecondsFromDay: jdn
>> >>+ seconds: s - offset
>> >>+ nanos: n
>> >>+ offset: offset!
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>setJdn:seconds:nano:offset: (in category
>> >> 'squeak protocol') -----
>> >>+ setJdn: jdn seconds: s nano: n offset: o
>> >>- setJdn: j seconds: s nano: n offset: o
>> >>
>> >>+ self setJdn: jdn seconds: s nano: n localOffsetSeconds: o asSeconds.
>> >>- jdn := j.
>> >>- seconds := s.
>> >>- nanos := n.
>> >>- offset := o
>> >> !
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>species (in category 'accessing') -----
>> >>+ species
>> >>+ ^DateAndTime!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>storeDataOn: (in category 'objects from
>> >>disk') -----
>> >>+ storeDataOn: aDataStream
>> >>+ "Store myself on a DataStream. Answer self.
>> >>+ Store 4 variables worth of data, corresponding to the 4 instance
>> >>variables of the old
>> >>+ DateAndTime implementation, which is to be used as common format for
>> >>externally
>> >>+ stored instances."
>> >>+
>> >>+ " | dt dt2 |
>> >>+ dt := DateAndTime now.
>> >>+ dt2 := DataStream testWith: dt.
>> >>+ { dt . dt2 }."
>> >>+
>> >>+ | cntInstVars cntIndexedVars ticks jdn offset seconds nanos |
>> >>+ "Set the instance variable count to 4 to match that of a cononical
>> >>instance." + cntInstVars := 4.
>> >>+ cntIndexedVars := self basicSize.
>> >>+ aDataStream
>> >>+ beginInstance: self xxxClass
>> >>+ size: cntInstVars + cntIndexedVars.
>> >>+
>> >>+ "Create the 4 values of the old format DateAndTime"
>> >>+ ticks := self ticks. "{days. seconds. nanoSeconds}."
>> >>+ offset := self offset.
>> >>+ jdn := ticks at: 1.
>> >>+ seconds := ticks at: 2.
>> >>+ nanos := ticks at: 3.
>> >>+ aDataStream
>> >>+ nextPut: seconds;
>> >>+ nextPut: offset;
>> >>+ nextPut: jdn;
>> >>+ nextPut: nanos.
>> >>+ !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>ticks (in category 'private') -----
>> >> ticks
>> >> "Private - answer an array with our instance variables. Assumed to
>> >> be UTC "
>> >>
>> >>+ ^ Array with: self julianDayNumber with: self getSeconds with: self
>> >>nanoSecond
>> >>- ^ Array with: jdn with: seconds with: nanos
>> >> !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>ticks:offset: (in category 'private') -----
>> >> ticks: ticks offset: utcOffset
>> >> "ticks is {julianDayNumber. secondCount. nanoSeconds}"
>> >>
>> >>+ | jdn s nanos |
>> >> self normalize: 3 ticks: ticks base: NanosInSecond.
>> >> self normalize: 2 ticks: ticks base: SecondsInDay.
>> >>
>> >> jdn := ticks at: 1.
>> >>+ s := ticks at: 2.
>> >>- seconds := ticks at: 2.
>> >> nanos := ticks at: 3.
>> >>+ localOffsetSeconds := utcOffset ifNil: [0] ifNotNil: [utcOffset
>> >>asSeconds].
>> >>+ utcMicroseconds := self microsecondsFromDay: jdn seconds: s nanos:
>> >>nanos offset: localOffsetSeconds.
>> >>- offset := utcOffset
>> >> !
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>utcMicroseconds (in category 'accessing')
>> >>-----
>> >>+ utcMicroseconds
>> >>+ ^utcMicroseconds!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>utcMicroseconds: (in category
>> >>'initialize-release') -----
>> >>+ utcMicroseconds: utcValue
>> >>+ "Allow value to be modified during initialization from a primitive
>> >>in order to support
>> >>+ monotonically increasing clock behavior."
>> >>+ utcMicroseconds := utcValue!
>> >>
>> >>Item was added:
>> >>+ ----- Method: DateAndTime>>utcMicroseconds:offset: (in category
>> >>'initialize-release') -----
>> >>+ utcMicroseconds: microsecondsSincePosixEpoch offset: tzOffset
>> >>+
>> >>+ utcMicroseconds := microsecondsSincePosixEpoch.
>> >>+ localOffsetSeconds := tzOffset.
>> >>+ !
>> >>
>> >>Item was changed:
>> >> ----- Method: DateAndTime>>utcOffset: (in category 'squeak protocol')
>> >> -----
>> >> utcOffset: anOffset
>> >>
>> >> "Answer a <DateAndTime> equivalent to the receiver but offset from
>> >> UTC by anOffset"
>> >>
>> >>+ self flag: #FIXME. "check the definition of this and of #offset:"
>> >>+ ^self utcMicroseconds: utcMicroseconds offset: anOffset asDuration
>> >>asSeconds
>> >>+ !
>> >>- | equiv |
>> >>- equiv := self + (anOffset asDuration - self offset).
>> >>- ^ equiv ticks: (equiv ticks) offset: anOffset asDuration; yourself!
>> >>
>> >>Item was changed:
>> >> ----- Method: LXDateAndTime>>asTimeStamp (in category 'squeak
>> >> protocol') -----
>> >> asTimeStamp
>> >>
>> >>+ ^ self asLXTimeStamp
>> >>- ^ self asDateAndTime asTimeStamp
>> >> !
>> >>
>> >>
>> >>
>>
>>
More information about the Squeak-dev
mailing list
|