将本地时间转换为特定时区,无论日光是否开启
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 目的,例如时区在年中更改其基准偏移量时。这种情况在美国以外经常发生。
我想将本地时间转换为 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 目的,例如时区在年中更改其基准偏移量时。这种情况在美国以外经常发生。