Timestamp.st
changeset 22894 81be3c10fb6c
parent 22890 0401fecb9c89
child 22914 1bb3760b2967
--- 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
     "