[squeak-dev] Testing membership in a Set of Date objects

Chris Cunningham cunningham.cb at gmail.com
Fri Oct 19 17:52:21 UTC 2018


Hi Tim,


On Thu, Oct 18, 2018 at 6:04 PM Tim Johnson <digit at sonic.net> wrote:

> Hi,
>
> I am very grateful to see the discussions about timezones on the list
> recently, because I just got hit by it today.
>
> I couldn't figure out why a Set containing Date objects didn't properly
> detect membership of a Date which was clearly present in the Set. It was
> because, I realize now, the Date objects in the Set had an offset of
> -0:07:00:00 (they are created by DateAndTime>>#now), and Dates created
> by e.g. "Date today" or "Date yesterday" either have no offset or the
> offset is 0:00:00:00.  I have found the comment in Timespan
> class>>#defaultOffset -- but it does not encourage me that I could
> change my defaultOffset to help myself.
>
> In my tests (code snippet below), if I make an OrderedCollection from
> the Set, the OrderedCollection can find the date object, even though the
> Set can't.
>
> In the Mean Time (get it?), can I create Dates with offsets?
> "(DateAndTime now - 1 day) asDate" works...?  Or are there any other
> workarounds?  Should I walk away from Date and use something else?
>
> Thanks!
>
> (in a Workspace)
> | dates |
> dates := Set newFrom: { Date yesterday. Date tomorrow.  DateAndTime now
> asDate }.
> dates includes: (Date year: 2018 month: 10 day: 18).   "=> false"
> dates asOrderedCollection includes: (Date year: 2018 month: 10 day: 18).
>   "=> true"
>

If you load the latest proposed fix that we are talking about
(Chronology-Core-cmm.15.mcz from the inbox), the results do change:

(in a Workspace)
| dates |
dates := Set newFrom: { Date yesterday. Date tomorrow.  DateAndTime now
asDate }.
dates includes: (Date year: 2018 month: 10 day: 19).   "=> false" "=> false"
dates asOrderedCollection includes: (Date year: 2018 month: 10 day: 19).
"=> true"  "=> false"

(first results pre-load, second results post-load). (changed your example
for today - otherwise you get true for both questions)

This change doesn't fix what you are getting - but at least the results are
consistent.  The issue is that a generic time-zone-less date is not the
same thing as a date with a specific timezone.  The current code mostly
made this true (as shown in the OrderedCollection test) but not fully (as
shown in your Set test).

As Chris Muller pointed out, if you send #stripTimezone with the new fix to
your array of dates before putting them into the set, I think you will get
what you want:

(in a Workspace)
| dates |
dates := Set newFrom: ( { Date yesterday. Date tomorrow.  DateAndTime now
asDate } collect: #stripTimezone ).
dates includes: (Date year: 2018 month: 10 day: 19). "true"
dates asOrderedCollection includes: (Date year: 2018 month: 10 day: 19).
"true"

Would it be convenient for you to try out the proposed Chronology fix in
your case (with or without the #stripTimezone), and report back if this
works well for you?  I'd like to make dates work like we all think they
should.

-cbc

>
>
> (in an inspector on a Set of dates with offsets)
> | a m |
> a := Date year: 2018 month: 10 day: 17.
> self includes: a.                               "-> false
> self like: a.                                   "-> nil"
> self asOrderedCollection includes: a.  "-> true"
> m := self array at: 4.          "-> 17 October 2018"
> m start offset.                         "-> -0:07:00:00"
> a start offset                          "-> 0:00:00:00"
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20181019/97373982/attachment.html>


More information about the Squeak-dev mailing list