--- 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
"