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






Reply via email to