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

Convert Local time to a Specific timezone irrespective of Daylight is ON

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

这是我完成所需的方法

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

如果你只想考虑时区的基准偏移量,那么你可以这样做:

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 目的,例如时区在年中更改其基准偏移量时。这种情况在美国以外经常发生。