50 lines
1.5 KiB
C#
50 lines
1.5 KiB
C#
namespace MiaoJiZhang.Api.Services;
|
|
|
|
public static class ChinaClock
|
|
{
|
|
private static readonly Lazy<TimeZoneInfo> 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)));
|
|
}
|
|
}
|
|
|