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.ml@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