Это зависит от того, что вы подразумеваете под «часовой пояс GMT + 1». Вы имеете в виду постоянно UTC + 1 или UTC + 1 или UTC + 2 в зависимости от летнего времени?
Если вы используете .NET 3.5, используйте TimeZoneInfo
, чтобы получить соответствующий часовой пояс, затем используйте:
// Store this statically somewhere
TimeZoneInfo maltaTimeZone = TimeZoneInfo.FindSystemTimeZoneById("...");
DateTime utc = DateTime.UtcNow;
DateTime malta = TimeZoneInfo.ConvertTimeFromUtc(utc, maltaTimeZone );
Вам нужно будет определить системный идентификатор для часового пояса Мальты, но это легко сделать, запустив этот код локально:
Console.WriteLine(TimeZoneInfo.Local.Id);
Судя по вашим комментариям, этот бит будет неактуален, но только для других ...
Если вы не используете .NET 3.5, вам придется самостоятельно отработать переход на летнее время. Если честно, самый простой способ сделать это будет простой таблицей поиска. Отработайте изменения DST на следующие несколько лет, затем напишите простой метод, чтобы вернуть смещение в определенное время UTC с жестко закодированным списком. Возможно, вы просто захотите отсортировать List<DateTime>
с известными изменениями и чередовать от 1 до 2 часов, пока ваша дата не станет после последнего изменения:
// 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!");
}