render timestamp in its own method so callers can override its format