Конвертировать дату и время в строку всегда по умолчанию смещение системного часового пояса, необходимо получить смещение часового пояса пользователя в результате
У меня есть код, где пользователь вводит DateTime и часовой пояс, в который даты должны быть преобразованы, и формат, в котором должна быть дата окончания. Ниже приведен код.
Код прекрасно преобразует DateTime в часовой пояс, введенный пользователем, но при форматировании Datetime значение смещения даты и времени всегда устанавливается по умолчанию на смещение часового пояса системы. Например, когда я конвертирую дату 2014-10-30T08:01: 01-06: 00 (центральное время) в стандартное тихоокеанское время и форматирую ее. Результат 2014-10-30T06: 01: 01 ** - 06: 00 **, он должен быть 2014-10-30T01: 01: 01 ** - 08:00 ** значение смещения по умолчанию установлено в системном часовом поясе который является центральным временем.
DateTime inputtime;
string TimezoneID;
String outputdateformat;
inputtime = "2014-10-30T08:01:01-05:00"
TimezoneID ="Pacific Standard Time".
Outputdateformat ="yyyy-MM-ddThh:mm:ss zz"
DateTime finaloutputtime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId (inputtime, TimezoneID);
string FinalFormattedDate = finaloutputtime.toString (outputdateformat);
2 ответа
Ты можешь использовать DateTimeOffset
вместо DateTime
справиться с этим:
DateTimeOffset time = DateTime.Now;
string timezoneID = "Pacific Standard Time";
TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById(timezoneID);
DateTimeOffset newTIme = TimeZoneInfo.ConvertTime(time, info);
string timeformat = newTIme.ToString("yyyy-MM-dd HH:mm:ss \"GMT\"zzz");
string oldtimeformat = time.ToString("yyyy-MM-dd HH:mm:ss \"GMT\"zzz");
Вы можете использовать выделенную функцию в TimeZoneInfo, если хотите преобразовать DateTimeOffset в другой DateTimeOffset
DateTimeOffset newTime = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"));
или вы можете сделать это
DateTime utc = new DateTime(2014, 6, 4, 12, 34, 0);
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
// it's a simple one-liner
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi);