我已经阅读了许多答案和文章,但我没有得到更好的解决方案。 我必须设置来自不同地区的每日,每周或每月的提醒。 即使我将时间转换为UTC,也会在该区域容易进行夏令时时出现问题。
答案 0 :(得分:0)
我已使用此代码解决了这个问题。 我们将从TimezoneId获取TimeZoneInfo
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(TimezoneId);
将DateTime转换为时间戳
private DateTime ComputeNextUtcTimeToRun(long dateTimeStamp, TimeZoneInfo timeZoneInfo)
{
try
{
// Get the current time in the target time zone
DateTime now = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, timeZoneInfo);
// Compute the next local time
DateTime scheduledLocalTime = (new DateTime(1970, 1, 1, 0, 0, 0)).AddMilliseconds(dateTimeStamp).ToLocalTime();
if (scheduledLocalTime < now)
{
scheduledLocalTime = scheduledLocalTime.AddDays(1);
}
// If it's invalid, advance. The clocks shifted forward!
if (timeZoneInfo.IsInvalidTime(scheduledLocalTime))
{
return TimeZoneInfo.ConvertTimeToUtc(scheduledLocalTime.AddHours(1), timeZoneInfo);
}
// If it's ambiguous, pick the first instance
if (timeZoneInfo.IsAmbiguousTime(scheduledLocalTime))
{
TimeSpan offset = timeZoneInfo.GetAmbiguousTimeOffsets(scheduledLocalTime).Max();
DateTimeOffset dto = new DateTimeOffset(scheduledLocalTime, offset);
return dto.UtcDateTime;
}
return TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(scheduledLocalTime, DateTimeKind.Unspecified), timeZoneInfo);
}
catch (Exception ex)
{
throw ex;
}
}
Please refer this link for more information
如果可以做得更好,请纠正我。