2017-02-21 24 views
0

Я пытаюсь преобразовать время между часовым поясомПреобразования времени между часовыми поясами, Конверсия не может быть завершена

public QueryResult<RadAcct> Query(DateTime dateFrom, DateTime dateTo, DbConnection dbConection) 
{ 
    TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time"); 

    //date from :2/20/2017 10:28:27 AM 
    DateTime from = TimeZoneInfo.ConvertTimeToUtc(dateFrom, tst); 

    // error here, date to : 2/21/2017 4:56:31 Am 
    DateTime to = TimeZoneInfo.ConvertTimeToUtc(dateTo, tst); 
} 

dateFrom и dateTo пришедшим из различных услуг и стоимости, 2/20/2017 10:28: 27 AM, 2/21/2017 4:56:31 Am

я получил исключение:

преобразование не может быть завершена, поскольку поставляемый DateTime не имеют свойство Kind установить правильно. Например, когда свойство типа является DateTimeKind.Local, время, источник зона должна быть TimeZoneInfo.Local \ г \ nParameter. Имя: sourceTimeZone

+0

Как инициализируется 'dateTo'? От клиента? Исходя из db? Запрограммированный? Исходя из другой службы? 'Am' намеренно или опечатка? –

+0

Ваш 'dateTo', похоже, недействителен, иначе нет возможности перевести его в другой часовой пояс. – Mairaj

+0

sr о том, что я обновил свой вопрос – beginerdeveloper

ответ

1

Используйте функцию DateTime.SpecifyKind для установки вида, чтобы Неизвестно,

TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time"); 
DateTime from = TimeZoneInfo.ConvertTimeToUtc(dateFrom, tst); //date from :2/20/2017 10:28:27 AM 

DateTime dateToUnspecified = DateTime.SpecifyKind(dateTo, DateTimeKind.Unspecified); 

DateTime to = TimeZoneInfo.ConvertTimeToUtc(dateToUnspecified, tst); // date to : 2/21/2017 4:56:31 Am 
+0

спасибо, что он работает – beginerdeveloper

+0

Добро пожаловать. –

+0

Кроме того, вы можете выяснить, как ваш код получил 'DateTimeKind.Local', привязанный к' dateTo', в первую очередь. Например, если 'dateTo' был заполнен из вызова' DateTime.Now', этот конкретный ответ не был бы правильным решением. –

0

Вы указали из часового пояса. Но я не могу найти временную зону. Вы можете использовать код ниже для преобразования времени между часовыми поясами.

 DateTime dateFrom = Convert.ToDateTime("2/21/2017 04:22:27 PM"); 
     TimeZoneInfo fromTimeZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time"); 
     DateTime from = TimeZoneInfo.ConvertTimeToUtc(dateFrom, fromTimeZone); 
     TimeZoneInfo toTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time"); 
     DateTime dateTo = TimeZoneInfo.ConvertTimeFromUtc(from, toTimeZone); 

Приведенный выше код является модификацией в вашем коде. Но вы можете использовать простой код для этого:

 DateTime dateFrom = Convert.ToDateTime("2/21/2017 04:22:27 PM"); 
     TimeZoneInfo fromTimeZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time"); 
     TimeZoneInfo toTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time"); 
     DateTime dateTo = TimeZoneInfo.ConvertTime(dateFrom, fromTimeZone, toTimeZone); 

Я думаю, вы просто хотите тайную как раз UTC. Причиной исключения может быть то, что для свойства «Тип» dateTo установлено значение «Локальный», а местный часовой пояс системы, на которой выполняется код, не «AUS Eastern Standard Time». Если тип даты, переданный методу ConvertTimeToUtc, является локальным, тогда метод ожидает, что параметр sourceTimeZone будет соответствовать локальному часовому поясу системы, в которой работает код.

Вы можете установить свойство Kind для dateTo для UnSpecified, используя код ниже. К этому вы не получите исключение:

DateTime.SpecifyKind(dateTo, DateTimeKind.Unspecified); 
+0

, но dateFrom и dateTo - это тот же часовой пояс, я должен преобразовать его в часовой пояс «AUS Eastern Standard Time» – beginerdeveloper