Điều này tùy thuộc vào ý nghĩa của "múi giờ GMT + 1". Bạn có nghĩa là UTC + 1 vĩnh viễn, hoặc bạn có nghĩa là UTC + 1 hoặc UTC + 2 tùy thuộc vào DST?
Nếu bạn đang sử dụng .NET 3.5, sử dụng TimeZoneInfo
để có được một múi giờ thích hợp, sau đó sử dụng:
// Store this statically somewhere
TimeZoneInfo maltaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("...");
DateTime utc = DateTime.UtcNow;
DateTime malta = TimeZoneInfo.ConvertTimeFromUtc(utc, maltaTimeZone);
Bạn sẽ cần phải làm việc ra ID hệ thống cho các múi giờ Malta, nhưng bạn có thể làm điều đó một cách dễ dàng bằng cách chạy mã này tại địa phương:
Console.WriteLine(TimeZoneInfo.Local.Id);
Đánh giá bởi bình luận của bạn, bit này sẽ không liên quan, nhưng chỉ dành riêng cho những người khác ...
Nếu bạn đang không phải sử dụng .NET 3.5, bạn sẽ cần phải tự mình tiết kiệm tiền tiết kiệm ánh sáng ban ngày. Thành thật mà nói, cách dễ nhất để thực hiện điều đó sẽ trở thành một bảng tra cứu đơn giản. Làm việc ra các thay đổi DST trong vài năm tới, sau đó viết một phương thức đơn giản để trả về giá trị bù trừ tại một thời điểm UTC cụ thể với danh sách đó được mã hóa cứng. Bạn chỉ có thể muốn có một sắp xếp List<DateTime>
với những thay đổi được biết đến ở, và xen kẽ giữa 1 và 2 giờ cho đến ngày của bạn là sau khi thay đổi lần cuối:
// Be very careful when building this list, and make sure they're UTC times!
private static readonly IEnumerable<DateTime> DstChanges = ...;
static DateTime ConvertToLocalTime(DateTime utc)
{
int hours = 1; // Or 2, depending on the first entry in your list
foreach (DateTime dstChange in DstChanges)
{
if (utc < dstChange)
{
return DateTime.SpecifyKind(utc.AddHours(hours), DateTimeKind.Local);
}
hours = 3 - hours; // Alternate between 1 and 2
}
throw new ArgumentOutOfRangeException("I don't have enough DST data!");
}
Nguồn
2009-07-10 09:48:07
Sử dụng 'DateTime.UtcNow.AddHours (1)' thay vào đó sẽ giúp bạn tiết kiệm một số đánh máy! – LukeH
Vâng, tôi đã nhận ra điều đó. Nhưng sau đó tôi không chắc chắn rằng họ làm chính xác điều tương tự; UtcNow tìm nạp thời gian hệ thống và thực hiện một số thao tác với "số ma thuật", trong khi ToUniversalTime sử dụng TimeZone.CurrentTimeZone để nhận thời gian Utc. Tôi cho rằng họ sẽ luôn luôn trở lại cùng một thời gian mặc dù o) –
'DateTime.Now' sử dụng' UtcNow' đằng sau hậu trường, do đó, mã ban đầu của bạn dịch sang một cái gì đó như 'DateTime.UtcNow.ToLocalTime(). ToUniversalTime(). AddHours (1) '. – LukeH