Чтобы получить текущее время я использую = DateTime.UtcNow, но у меня всегда получается на 3 часа меньше от московского времени.
Наверное потому что МСК время = UTC+3.
DateTime.UtcNow возвращает как раз текущие Utc время, тебе просто стоит DateTime.UtcNow.AddHours(3) юзать.