我想将本地时间转换为PST(非PDT作为其当前的日光) 我希望这种方法具有通用性,以便我可以将其用于任何时区,而不仅仅是太平洋。
public static DateTime ConvertDateToTimezone(DateTime givenDateTime, string timezoneId, bool considerDaylight)
{
if (!considerDaylight)
{
//ToDo need to implement
// Convert time to "timezoneId" irrespective of Daylight is on or not.
// var timezone =
// TimeZoneInfo.GetSystemTimeZones()
// .FirstOrDefault(x => x.Id.Equals(timezoneId));
// TimeZoneInfo.ConvertTimeBySystemTimeZoneId(givenDateTime, timezoneId);
}
return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(givenDateTime, timezoneId);
}
答案 0 :(得分:1)
如果您只想考虑时区的基本偏移,那么您可以这样做:
public static DateTimeOffset ConvertToTimeZone(DateTimeOffset dto, string timeZoneId, bool considerDaylight)
{
var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
if (considerDaylight)
{
// this is the normal behavior
return TimeZoneInfo.ConvertTime(dto, timeZone);
}
else
{
// the base offset doesn't include DST adjustment
return dto.ToOffset(timeZone.BaseUtcOffset);
}
}
然而,就像Jon在问题评论中提到的那样,不建议这样做。你可能应该存储UTC。你真的应该回去与你的客户讨论这个问题。
此外,还要注意有时DST调整用于非DST目的,例如当时区在一年中改变其基本偏移时。这种情况经常发生在美国以外。
答案 1 :(得分:0)
以下是我如何完成我需要的工作
public static DateTimeOffset ConvertDateToTimezone(DateTimeOffset givenDateTime, string timezoneId, bool considerDaylight)
{
if (!considerDaylight)
{
var timezone =
TimeZoneInfo.GetSystemTimeZones()
.FirstOrDefault(x => x.Id.Equals(timezoneId));
var utcTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(givenDateTime, timezoneId).ToUniversalTime();
if (timezone != null) return utcTime.AddHours(timezone.BaseUtcOffset.Hours);
}
return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(givenDateTime, timezoneId);
}