Преобразование даты и времени в строку всегда по умолчанию соответствует смещению системного часового пояса, необходимо получить смещение часового пояса пользователя в результате

У меня есть код, в котором пользователь вводит DateTime и часовой пояс, в который нужно преобразовать даты, и формат, в котором должна быть конечная дата. Ниже приведен код.

Код полностью преобразует DateTime в часовой пояс, введенный пользователем, но при форматировании Datetime значение смещения даты и времени всегда устанавливается по умолчанию равным смещению системного часового пояса. Например, когда я конвертирую Date 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);

строка FinalFormattedDate = finaloutputtime.toString (outputdateformat);


person DaD    schedule 29.04.2015    source источник
comment
каков будет пример того, каким будет `outputdateformat? '   -  person DrewJordan    schedule 29.04.2015
comment
Почему вы передаете outputdateformat в TimeSoneInfo.ConvertTimeBySystemTimeZoneId вместо идентификатора часового пояса места назначения?   -  person juharr    schedule 29.04.2015
comment
Время сохраняется на компьютере в виде числа в формате UTC, если используется часовой пояс по умолчанию. Метод ToString () предполагает, что на выходе будет местное время, если в коде не указан другой часовой пояс.   -  person jdweng    schedule 29.04.2015
comment
Я отредактировал ваше название. См. Должны ли вопросы включать «теги» в свои заголовки?, где нет единого мнения, не следует.   -  person John Saunders    schedule 29.04.2015


Ответы (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");
person DrewJordan    schedule 29.04.2015
comment
Спасибо, Джордан! это устранило мою проблему - person DaD; 30.04.2015

Вы можете использовать специальную функцию в 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);
person BSG    schedule 29.04.2015