Normally I store all objects as 4x4 Matrices (you could do 3x3 but easier for me just to have 1 class) instead of translating back and forth between a 4x4 and 3 sets of vector3s (Translation, Rotation, Scale). Euler angles are notoriously difficult to deal with in certain scenarios so I would recommend using Quaternions if you really want to store the components instead of a matrix.
But here is some code I found a while back that works. I hope this helps, unfortunately I do not have the original source for where I found this. I have no idea what odd scenarios it may not work in. I am currently using this to get the rotation of YawPitchRoll rotated, left handed 4x4 matrices.
union {
struct
{
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
float m[4][4];
float m2[16];
};
inline void GetRotation(float& Yaw, float& Pitch, float& Roll) const
{
if (_11 == 1.0f)
{
Yaw = atan2f(_13, _34);
Pitch = 0;
Roll = 0;
}else if (_11 == -1.0f)
{
Yaw = atan2f(_13, _34);
Pitch = 0;
Roll = 0;
}else
{
Yaw = atan2(-_31,_11);
Pitch = asin(_21);
Roll = atan2(-_23,_22);
}
}
Here is another thread I found while trying to answer your question that looked like a similar result to mine.
http://stackoverflow.com/questions/1996957/conversion-euler-to-matrix-and-matrix-to-eulerhttps://stackoverflow.com/questions/1996957/conversion-euler-to-matrix-and-matrix-to-euler