2010-07-29 3 views
5

У меня есть datetime (in utc), сохраненный в базе данных, и я также знаю смещение utc в следующем формате.convert utc time and offset to DateTime

-03:00:00 

как преобразовать это DateTime

+1

'12: 12: 12' не выглядит как смещение UTC для меня или поле' datetime'. Можете ли вы рассказать о значении каждой части? – Oded

+2

http://stackoverflow.com/questions/2548235/convert-utc-datetime-to-another-time-zone это поможет вам –

+0

@Oded это смещение utc. это диапазон от -12: 00: 00 до 13:00:00 – developer

ответ

10

Этот простейший способ применить «смещение» к DateTime, что у вас уже есть, чтобы создать TimeSpan структуру, которая держит ваше значение смещения, а затем просто " добавить "смещение в исходное значение DateTime.

Например:

DateTime utcDateTime = DateTime.Parse("29 July 2010 14:13:45"); 
TimeSpan offSet = TimeSpan.Parse("-03:00:00"); 
DateTime newDateTime = utcDateTime + offSet; 
Console.WriteLine(newDateTime); 

Это приводит следующий вывод:

29/07/2010 11:13:45

, который является оригинальным времени (29 июля 2010 14:13:45) минус 3 часа (смещение - -03: 00: 00).

Обратите внимание, что этот метод просто выполняет простую арифметику с вашим значением DateTime и не учитывает никаких часовых поясов.

+2

Обратите внимание, что Parse терпит неудачу, когда у вас есть знак «+» в строке. Поэтому используйте знак «-» или вообще нет! http://msdn.microsoft.com/en-us/library/se73z7b9%28v=vs.110%29.aspx – Jowen

+0

Как насчет летнего времени? –

+0

@AnilPurswani Вы можете применить только переход на летнее время, если вы знаете конкретный часовой пояс, а не только «смещение часов». Класс TimeZoneInfo имеет свойство (SupportsDaylightSavingTime), чтобы указать, поддерживает ли определенный часовой пояс переход на летнее время. Различные часовые пояса могут иметь одинаковое смещение часов, но могут или не могут поддерживать летнее время. – CraigTP

0

Проблемы вы, вероятно, работаете в том, что большинство водителей DB при выборке из базы данных будут создавать DateTime с DateTimeKind.Unspecified, который не может преобразовать в UTC должным образом, даже при использовании ToUniversalTime. Чтобы получить arround это, я использую метод расширения следующим образом:

public static DateTime ToSafeUniversalTime(this DateTime date) { 
     if(date != DateTime.MinValue && date != DateTime.MaxValue) { 
      switch(date.Kind) { 
      case DateTimeKind.Unspecified: 
       date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, DateTimeKind.Utc); 
       break; 
      case DateTimeKind.Local: 
       date = date.ToUniversalTime(); 
       break; 
      } 
     } 
     return date; 
    }