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

У меня есть код, где пользователь вводит 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);
Другие вопросы по тегам