diff -r 8398b8003a8e -r 81be3c10fb6c Timestamp.st --- a/Timestamp.st Fri May 11 01:11:20 2018 +0200 +++ b/Timestamp.st Fri May 11 01:11:31 2018 +0200 @@ -741,18 +741,23 @@ hour == 24 ifTrue:[ (min ~~ 0 or:[sec ~~ 0 or:[millis ~~ 0]]) ifTrue:[ TimeConversionError raiseErrorString:' - bad hour' ]. ]. + utcOffsetOrNil notNil ifTrue:[ utcOffsetOrNil = 0 ifTrue:[ "/ utc timestamp - ^ UtcTimestamp year:year month:month day:day hour:hour minute:min second:sec millisecond:millis + ts := UtcTimestamp year:year month:month day:day hour:hour minute:min second:sec millisecond:millis + ] ifFalse:[ + "/ tz timestamp + ts := ((TZTimestamp basicNew + setOSTimeFromUTCYear:year month:month day:day + hour:hour minute:min second:sec millisecond:millis + ) utcOffset:utcOffsetOrNil + ) addSeconds:utcOffsetOrNil. ]. - ^ TZTimestamp new - UTCyear:year month:month day:day hour:hour minute:min second:sec millisecond:millis; - utcOffset:utcOffsetOrNil; - addSeconds:utcOffsetOrNil. + ] ifFalse:[ + "/ a local timestamp + ts := self year:year month:month day:day hour:hour minute:min second:sec millisecond:millis. ]. - "/ a local timestamp - ts := self year:year month:month day:day hour:hour minute:min second:sec millisecond:millis. picos ~~ 0 ifTrue:[ ts additionalPicoseconds:picos ]. ^ ts @@ -1002,6 +1007,7 @@ %s seconds, 00..59 0-padded to length 2 %i milliseconds, 000..999 0-padded to length 3 %f fractional seconds any length, but only milliseconds kept + %F fractional seconds any length, up to picoseconds kept %a am/pm %tz timezone @@ -1034,7 +1040,7 @@ |day month year dayOfYear monthAndDay hour minute second millisecond utcOffset inStream formatStream error fChar format itemHandler - len now s fractionString fraction| + len now s fractionString fraction picos ts| error := [:msg | exceptionalValue isBlock ifTrue:[ @@ -1129,8 +1135,13 @@ ] ifFalse:[ ( format = 'f' or:[ format = 'F' ]) ifTrue:[ fractionString := input upToMatching:[:ch | ch isDigit not]. fraction := FixedPoint readFrom:'0.',fractionString. - millisecond := (fraction * 1000) truncated. - + format = 'f' ifTrue:[ + millisecond := (fraction * 1000) truncated. + ] ifFalse:[ + picos := (fraction * 1000*1000*1000*1000) truncated. + millisecond := picos // (1000*1000*1000). + picos := picos \\ (1000*1000*1000). + ]. ] ifFalse:[ ( format = 'tz' ) ifTrue:[ utcOffset := self utcOffsetFrom:input. utcOffset isNil ifTrue:[ error value:'invalid timezone' ] @@ -1206,20 +1217,25 @@ utcOffset notNil ifTrue:[ utcOffset == 0 ifTrue:[ -self halt. - ^ (UtcTimestamp + ts := (UtcTimestamp year:year month:month day:day hour:(hour ? 0) minute:(minute ? 0) second:(second ? 0) millisecond:millisecond) - ]. - ^ (TZTimestamp + ] ifFalse:[ + ts := ((TZTimestamp basicNew + setOSTimeFromUTCYear:year month:month day:day + hour:(hour ? 0) minute:(minute ? 0) second:(second ? 0) millisecond:millisecond + ) utcOffset:utcOffset + ) addSeconds:utcOffset. + ] + ] ifFalse:[ + ts := (self year:year month:month day:day - hour:(hour ? 0) minute:(minute ? 0) second:(second ? 0) millisecond:millisecond) - utcOffset:utcOffset + hour:(hour ? 0) minute:(minute ? 0) second:(second ? 0) millisecond:millisecond) ]. - - ^ (self - year:year month:month day:day - hour:(hour ? 0) minute:(minute ? 0) second:(second ? 0) millisecond:millisecond) + picos notNil ifTrue:[ + ts additionalPicoseconds:picos + ]. + ^ ts. " Timestamp readFrom:'20-2-1995 13:11:06' format:'%day-%month-%year %h:%m:%s' language:nil onError:[self halt] @@ -1668,10 +1684,11 @@ (utcOffset isNil or:[utcOffset = 0]) ifTrue:[ ^ UtcTimestamp year:year month:month day:day hour:time hour minute:time minute second:time second millisecond:0. ]. - ^ TZTimestamp new - setOSTimeFromUTCYear:year month:month day:day hour:time hour minute:time minute second:time second millisecond:0; - utcOffset:utcOffset; - addSeconds:utcOffset. + ^ ((TZTimestamp new + setOSTimeFromUTCYear:year month:month day:day + hour:time hour minute:time minute second:time second millisecond:0 + ) utcOffset:utcOffset + ) addSeconds:utcOffset. " self readRFC1123FormatFrom:'Mon, 17 Aug 2009 11:11:15 GMT' onError:nil @@ -2855,7 +2872,7 @@ Timestamp now asTZTimestamp -- now in your local timezone Timestamp now asUtcTimestamp -- now in greenwich UtcTimestamp now -- now in greenwich - Timestamp now utcOffset:(-2 hours)2015-11-09 17:29:35.803+02 -- now in East Europe + Timestamp now utcOffset:(-2 hours) -- now in East Europe Timestamp now utcOffset:(5 hours) -- now in Eastern time Timestamp now asTZTimestampInZone:'EST' -- now in Eastern time "