I hadn’t heard of that library - looks like one to keep in the back of my mind for more serious date related work.
I do think that age or ageOn: should be in the standard core particularly when we have so many date and duration related classes - but I’m not sure what the feeling is about adding methods. Certainly the group I saw learning smalltalk were very surprised it wasn’t there particularly when they saw the rich models we do have. I am also wondering if the issue with Timespan is concerning - I was surprised that putting a start and end date left me something that didn’t answer my end date presumably down to rounding when it’s converted down to a duration (making me wonder if its better to keep a start and end date and calculate the duration on the fly). Tim > On 21 Jul 2017, at 13:58, Esteban A. Maringolo <emaring...@gmail.com> wrote: > > Tim, > > You might consider a full-fledged framework for it like Chalten: > https://github.com/ba-st/chalten > > I don't know how it handles timezones, because the age calculation > might get trickier if you consider also the time of birth and you're > querying it from a different timezone ;-) > > Regards! > > Esteban A. Maringolo > > > 2017-07-21 6:09 GMT-03:00 K K Subbu <kksubbu...@gmail.com>: >> I suppose no one needed it that badly ;-). Age is the difference in years >> except when the given date's julian is less than self's julian when it is >> less by 1, so the code can be simplified to: >> >> ^aDate year - self year - >> (aDate dayOfYear < self dayOfYear) ifTrue: [ 1 ] ifFalse: [ 0 ]) >> >> BTW, the code has an off-by-one error. +1 should be dropped in first age >> assignment. >> >> Regards .. Subbu >> >> >> On Friday 21 July 2017 12:55 PM, Tim Mackinnon wrote: >>> >>> Yes that's a good solution, however I'm really surprised that with the >>> plethora of dates, durations, timespans (we are well served with a very rich >>> time and date domain) that this isn't already in the image? >>> >>> It seems very surprising. In fact the group I was working with (other >>> language programmers) kept looking and looking for something as they felt >>> certain they had overlooked it given all those promising classes. >>> >>> I'm curious why it's not in there? And would we also expect to find its >>> equivalent on a timespan (maybe delegating back to this date method? This >>> assumes that timespan can be fixed as it loses precision unexpectedly). >>> >>> Thanks for the reply. >>> >>> Tim >>> >>> >>> >>> Sent from my iPhone >>> >>>> On 21 Jul 2017, at 06:41, K K Subbu <kksubbu...@gmail.com> wrote: >>>> >>>> Date>>ageOn: aDate >>>> " assert: (self <= aDate) >>>> | age | >>>> >>>> age = aDate year - self year + 1. >>>> aDate monthIndex < self monthIndex ifTrue: [ ^age - 1 ]. >>>> (aDate monthIndex = self monthIndex and: [aDate dayOfMonth < self >>>> dayOfMonth]) ifTrue: [ ^age - 1 ]. >>>> ^age >>>> >>>> HTH .. Subbu >>>> >>>>> On Friday 21 July 2017 05:28 AM, Tim Mackinnon wrote: >>>>> Hi - I just ran a great MobProgramming session with Smalltalk for the >>>>> XProLo group - and there was lots of great feedback and questions, however >>>>> one of them really got me thinking… >>>>> We did a little exercise to create a Person class with name, dob - and >>>>> then we TDD’d an age method… which seems simple on the surface but it gets >>>>> to an interesting point - what about leap years? How old is someone on >>>>> those >>>>> years? >>>>> I thought that our plethora of Date/Duration classes might handle this - >>>>> but I couldn’t spot something obvious and was wondering if someone had a >>>>> neat answer. >>>>> Essentially if you try: >>>>> age >>>>> ^Date today - self dob >>>>> You get a Duration, >>>>> But there isn’t : >>>>> ^(Date today - self dob) asYears >>>>> There is is asDay >>>>> ^(Date today - self dob) asDays >>>>> But then can you really >>>>> ^(Date today - self dob) asDays / 365) truncated >>>>> But what about leap years… so >>>>> ^(Date today - self dob) asDays / 365.25) truncated >>>>> It all feels a bit inelegant and I suspect there is a better Smalltalk >>>>> way that is eluding me? Any suggestions? >>>>> Tim >>>> >>>> >>>> >>> >>> >> >> >