Files
GmRelayBot/src/GmRelay.Shared/Domain/MoscowTime.cs
T
Toutsu 66e7f5eea7
Deploy Telegram Bot / build-and-push (push) Successful in 1m4s
Deploy Telegram Bot / deploy (push) Successful in 11s
Решение проблемы с таймзонами
2026-04-20 14:36:53 +03:00

35 lines
1.4 KiB
C#

namespace GmRelay.Shared.Domain;
public static class MoscowTime
{
private static readonly TimeSpan MoscowOffset = TimeSpan.FromHours(3);
public static DateTimeOffset Now => DateTimeOffset.UtcNow.ToOffset(MoscowOffset);
public static DateTimeOffset ToMoscow(this DateTimeOffset utc) => utc.ToOffset(MoscowOffset);
public static string FormatMoscow(this DateTimeOffset utc)
=> utc.ToOffset(MoscowOffset).ToString("d MMMM yyyy, HH:mm", System.Globalization.CultureInfo.GetCultureInfo("ru-RU"));
public static DateTime ToMoscow(this DateTime utcDt) => DateTime.SpecifyKind(utcDt.Add(MoscowOffset), DateTimeKind.Unspecified);
public static string FormatMoscow(this DateTime utcDt)
=> utcDt.Add(MoscowOffset).ToString("d MMMM yyyy, HH:mm", System.Globalization.CultureInfo.GetCultureInfo("ru-RU"));
public static string FormatMoscowShort(this DateTime utcDt)
=> utcDt.Add(MoscowOffset).ToString("dd.MM");
public static bool TryParseMoscow(string text, out DateTimeOffset utcTime)
{
if (DateTime.TryParseExact(text, new[] { "dd.MM.yyyy HH:mm", "dd.MM.yyyy H:mm", "d.MM.yyyy HH:mm" },
System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out var localDt))
{
utcTime = new DateTimeOffset(localDt, MoscowOffset).ToUniversalTime();
return true;
}
utcTime = default;
return false;
}
}