Câu trả lời Antartica chỉ hoạt động cho múi giờ khớp với UTC. Tôi khá bị tổn thương với chức năng DateTimeOffset
này và sau nhiều giờ dùng thử và lỗi, tôi đã quản lý để tạo ra một chức năng mở rộng chuyển đổi thực tế hoạt động với tất cả các múi giờ.
static public class DateTimeFunctions
{
static public DateTimeOffset ConvertUtcTimeToTimeZone(this DateTime dateTime, string toTimeZoneDesc)
{
if (dateTime.Kind != DateTimeKind.Utc) throw new Exception("dateTime needs to have Kind property set to Utc");
var toUtcOffset = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc).GetUtcOffset(dateTime);
var convertedTime = DateTime.SpecifyKind(dateTime.Add(toUtcOffset), DateTimeKind.Unspecified);
return new DateTimeOffset(convertedTime, toUtcOffset);
}
}
Ví dụ:
var currentTimeInPacificTime = DateTime.UtcNow.ConvertUtcTimeToTimeZone("Pacific Standard Time");
tôi phải đi thêm một bước phụ để có được thời gian địa phương của tôi: var offset = tzi.GetUtcOffset (utcTime); var siteLocalTime = utcTime.Add (offset); trang web trả vềLocalTime.ToString ("MM/dd/yyyy HH: mm"); –
Mã này không biên dịch. Id múi giờ đó không tồn tại và nếu bạn thay thế nó bằng giá trị hợp lệ thì bạn sẽ gặp lỗi về 'Trường hợp UTC Offset cho Utc DateTime phải là 0'. –
để tránh lỗi trong dateAndOffset chọn DateTime cstTime = utcTime.AddTicks (southPole.BaseUtcOffset.Ticks); –