After some frustrating troubleshooting of what I thought would be simple code today, I learned something unexpected:
Created By and
Last Modified By are not populated or set in the
before context of DML operations. This means that
before insert,
CreatedById,
CreatedDate,
LastModifiedById and
LastModifiedDate are all empty. And
before update,
LastModifiedById and
LastModifiedDate will reflect the
previous person to modify the record, not the current user (which would be yourself if you are the one editing the record).
While this was counter-intuitive at first, I came to realize that there's no need to rely on those fields in the context of Apex triggers. All I really need is UserInfo.getUserId() and DateTime.now() to get the time.
Just like that... I learned something new today.