Thanks for the report.

Yes, an issue, a unit test and a slice to fix it would be cool ;-)

BTW, what do you propose: throw an error or use a zero time ?

On 19 Feb 2014, at 10:27, Diego Lont <[email protected]> wrote:

> Hi all,
> 
> I probably should make an issue out of this, and follow the workflow, but I 
> found a bug in the DateAndTime class in the method readFrom:
> 
> This method comes in an infinite loop, if there is only a date specified: it 
> tried to do aStream next while aStream peek is not a digit. And since aStream 
> peek returns nil when the stream is at the end, this will result in an 
> infinite loop. Here is the fixed method.
> 
> Cheers,
> Diego
> 
> readFrom: aStream
>       "Parse and return a new DateAndTime instance from stream, 
>       as a Date, a Time and a TimeZone offset."
>       "self readFrom: ' 2013-03-04T23:47:52.876+01:00' readStream"
> 
>       | offset date time |
>       date := Date readFrom: aStream.
>       [ aStream peek isDigit or: [ aStream atEnd ] ] whileFalse: [ aStream 
> next ].
>       aStream atEnd
>               ifTrue: [ time := Time midnight ]
>               ifFalse: [ time := Time readFrom: aStream ].
>       aStream skipSeparators.
>       offset := self readTimezoneOffsetFrom: aStream.
>       ^ self
>               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 
>       "


Reply via email to