Usually the m_ prefix is used for member variables but you use it for function parameters instead. Oh well, I don't care, I just felt like pointing it out in case made it by mistake.
I think the problem is that localtime returns a pointer to a static internal tm object. When localtime is called a second time it will reuse the same object it used the first time, change it and return the same pointer to it. All Message::date pointers will point to the same object so that is why you get the same output.
And thanks on the actual problem, that makes sense. I'll try changing it in a second.
Problem Solved! Here is the changes I did to the code:
-to the private fields: struct tm date;
-to the constructor: date=*localtime(&d_raw);
-to the tests: strftime (strng,18,"%c",&(msg2.getDate()));
Once again, thanks for the help!