2016-11-03 7 views
0

Я создал логическое приложение, которое считывает данные из SharePoint онлайн с помощью действия get-item.Как конвертировать поле «Дата только SharePoint» из UTC в местный часовой пояс

Однако - У меня есть столбец sharepoint типа Date-Only, который возвращает, очевидно, только часть даты (как предполагалось только для даты).

Проблема заключается в том, что sharepoint внутренне использует дату-время (UTC!) Для хранения даты. Поэтому, когда я создаю запись в sharepoint в свое местное время (CET!) С датой «2016-10-20», она сохраняется как 2016-10-19T22:00.00Z.

Итак, теперь логическое приложение-приложение отправляет rest-call, который вернет 2016-10-19. Итак, как я должен получить свою первоначальную дату? Даже если бы я лечить ответ как UTC и преобразовать его к моему местному времени (с помощью лазурного-функции) Я хотел бы получить 2016-10-19T02:00.00 как результат вместо 2016-10-20T02:00.00

+0

Где ваш код? Как вы устанавливаете дату? Скорее всего, вы отправляете локальное значение DateTime (DateTimeKind.Local), которое сервер должен изменить перед сохранением. Даже если SP будет сохранено по местному времени, вы все равно получите ту же ошибку, если у сервера был другой часовой пояс из вашего кода. Используйте 'ToUtc' для создания значения с помощью' DateTimeKind.UTC' или используйте 'DateTimeOffset', чтобы избежать каких-либо неопределенностей. –

+0

BTW. Я думаю, что службы SP используют ISO8601 (эквивалент datetimeoffset), что означает, что время было изменено вашим кодом, когда локальный 'DateTime' был преобразован в' 2016-10-20T00: 00: 00 + 02: 00' - правильное местное время в формате ISO8601. –

+0

Я редактирую элементы списка SharePoint в SharePoint-UI. Это ответ, который я получаю от логического приложения: «body»: { [... сокращенно для краткости ...] "orderdate": "2016-10-19" } – nyn3x

ответ

3

При создании или обновлении Записи SharePoint новообращенных (на основе текущей Time Zone выбран на сайте Regional Settings) и сохраняет значения datetime в скоординированном универсальном времени (UTC). Служба SharePoint Online REST возвращает DateTime в формате UTC (кроме других услуг в Office 365, как услуги Outlook, где он может управляться с помощью Prefer: outlook.timezone заголовка, смотрите, например here для более подробной информации)

Предпосылка

Moment.js библиотека

Сказав, что вам нужно преобразовать значения даты и времени от ответа REST, чтобы отобразить его в местное время:

var orderDateString = "2016-10-19T22:00.00Z"; //relative datetime value in REST response 
var offset = 120; //CET offset 
var localOrderDate = moment.utc(orderDateString).utcOffset(offset); 
console.log(localOrderDate.format('LL')); //print local date part 

Или вы можете использовать следующую функцию, которая преобразует заданное значение DateTime из универсального координированного времени (UTC) местное время

var TimeZoneUtilities = { 
    utcToLocalTime: function getSPCurrentTime(webUrl,value) { 
    return $.ajax({ 
     url: webUrl + "/_api/web/RegionalSettings/TimeZone", 
     method: "GET", 
     headers: { "Accept": "application/json; odata=verbose" } 
    }).then(function (data) { 
     var offset = -(data.d.Information.Bias + data.d.Information.StandardBias + data.d.Information.DaylightBias)/60.0; 
     return moment.utc(orderDateString).utcOffset(offset).toDate(); 
    }); 
    } 
}; 

Эта функция аналогична SPTimeZone.LocalTimeToUTC method из SharePoint API.

Использование

var orderDateString = "2016-10-19T22:00.00Z"; //UTC datetime value from REST response 
var orderDate = new Date(orderDateString); 
TimeZoneUtilities.utcToLocalTime(_spPageContextInfo.webAbsoluteUrl,orderDate) 
.done(function(value) 
{ 
    console.log("Server time: " + value.format("yyyy MM dd")); 
}) 
.fail(function(error){ 
    console.log(JSON.stringify(error)); 
}); 
+0

thx для этого удивительный ответ - но моя проблема заключалась в том, что я настроил поле в sharepoint на «date only». В промежутке времени дата все еще сохраняется как дата и время, но часть времени в ответе отсутствует. Но все же возвращаемое значение основано на UTC. Это делает невозможным преобразование в любой другой часовой пояс, если в ответе отсутствует временная часть.Теперь я изменил конфигурацию sharepoint, указав дату * и * время. – nyn3x