namespace MiaoJiZhang.Api.Services; public static class ChinaClock { private static readonly Lazy Zone = new(() => { try { return TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai"); } catch (TimeZoneNotFoundException) { return TimeZoneInfo.FindSystemTimeZoneById("China Standard Time"); } }); public static DateTime Now => ToLocal(DateTime.UtcNow); public static DateTime ToLocal(DateTime utc) => TimeZoneInfo.ConvertTimeFromUtc( DateTime.SpecifyKind(utc, DateTimeKind.Utc), Zone.Value); public static DateTime ToUtc(DateTime local) => TimeZoneInfo.ConvertTimeToUtc( DateTime.SpecifyKind(local, DateTimeKind.Unspecified), Zone.Value); public static (DateTime Start, DateTime End) WeekRangeUtc(DateTime localDate) { var date = DateTime.SpecifyKind(localDate.Date, DateTimeKind.Unspecified); var offset = ((int)date.DayOfWeek + 6) % 7; var start = date.AddDays(-offset); return (ToUtc(start), ToUtc(start.AddDays(7))); } public static (DateTime Start, DateTime End) MonthRangeUtc(int year, int month) { var start = new DateTime(year, month, 1); return (ToUtc(start), ToUtc(start.AddMonths(1))); } public static (DateTime Start, DateTime End) YearRangeUtc(int year) { var start = new DateTime(year, 1, 1); return (ToUtc(start), ToUtc(start.AddYears(1))); } }