无论日光是否打开,都将本地时间转换为特定时区

时间:2016-03-17 16:08:07

标签: c#-4.0 timezone dst

我想将本地时间转换为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);
}

2 个答案:

答案 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);
    }