SuiteTalk и несоответствие часового пояса

Я выполняю поиск через SuiteTalk и получаю одиночную запись с lastModifiedDate:

<listrel:lastmodifieddate>2014-12-12T11:12:24.000-08:00</listrel:lastmodifieddate>

Я обновил эту запись в 19:12:24 по Великобритании, поэтому я знаю, что lastModifiedDate верен.

В моем коде С# я прочитал значение lastModifiedDate, которое получает меня 12/12/2014 19:12:24, когда я ToString значение lastModifiedDate DateTime.

Затем я изменяю запись так, чтобы ее lastModifiedDate теперь изменился.

Затем я выполняю другой поиск, на этот раз указав предыдущее значение lastModifiedDate в критериях поиска.

Сгенерированный запрос XML выглядит следующим образом:

<q1:lastmodifieddate operator="notBefore">
 <searchvalue xmlns="urn:core_2014_2.platform.webservices.netsuite.com">2014-12-12T19:12:24</searchvalue>
 </q1:lastmodifieddate>

Нет записей ответов.

Это, я полагаю, связано с тем, что SuiteTalk предполагает, что 2014-12-12T19: 12: 24 совпадает с 2014-12-12T19: 12: 24-08: 00, что в будущем и, безусловно, после того, как я обновил запись минутой назад.

Итак, как я могу заставить SuiteTalk узнать, какое время я имею в виду?

1 ответ

В идеале вы бы взаимодействовали с типом DateTimeOffset, поэтому не было путаницы.

Однако, поскольку вы сказали, что работаете с кодом, генерируемым из WSDL, и вы не можете изменить WSDL или код, который он генерирует, тогда вы должны взаимодействовать с типом DateTime. При этом убедитесь, что свойство .Kind в DateTimeKind.Utc так что время сдвигается в UTC и при сериализации в формате ISO8601, xml будет содержать символ Z в конце.

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

DateTime dt = new DateTime(2014,12,12,19,12,24);
foo.LastModifiedDate = dt.ToUniversalTime();

Или, если вы работаете с определенным часовым поясом, вы можете сделать что-то вроде этого:

DateTime dt = new DateTime(2014,12,12,19,12,24);
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
foo.LastModifiedDate = TimeZoneInfo.ConvertTimeToUtc(dt, tzi);

licensed under cc by-sa 3.0 with attribution.