Rest 如何将SharePoint仅日期字段从UTC转换为本地时区

Rest 如何将SharePoint仅日期字段从UTC转换为本地时区,rest,azure,sharepoint,azure-logic-apps,Rest,Azure,Sharepoint,Azure Logic Apps,我创建了一个逻辑应用程序,它使用“获取项目”操作从SharePoint online读取数据 然而,我有一个类型为Date Only的sharepoint列,它显然只返回日期部分(正如Date Only所暗示的那样) 问题是,sharepoint内部使用日期时间(UTC!)存储日期。因此,当我在本地时间(CET!)在sharepoint中创建一个日期为“2016-10-20”的条目时,它存储为2016-10-19T22:00.00Z 因此,现在logic app操作正在发送一个rest调用,该调

我创建了一个逻辑应用程序,它使用“获取项目”操作从SharePoint online读取数据

然而,我有一个类型为Date Only的sharepoint列,它显然只返回日期部分(正如Date Only所暗示的那样)

问题是,sharepoint内部使用日期时间(UTC!)存储日期。因此,当我在本地时间(CET!)在sharepoint中创建一个日期为“2016-10-20”的条目时,它存储为
2016-10-19T22:00.00Z


因此,现在logic app操作正在发送一个rest调用,该调用将返回
2016-10-19
。那我怎么才能得到我原来的约会呢?即使我将响应视为UTC并将其转换为本地时间(使用azure函数),在创建或更新条目时,我也会得到
2016-10-19T02:00.00
,而不是
2016-10-20T02:00.00

(基于在站点
区域设置
中选择的当前
时区
),并以协调世界时(UTC)保存日期时间值。SharePoint Online REST service以UTC返回日期时间(除了Office 365中的其他服务外,如Outlook services,它可以通过
首选:Outlook.timezone
标题进行控制,有关更多详细信息,请参见示例)

先决条件

图书馆

如上所述,您需要将REST响应中的datetime值转换为本地时间:

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

或者,您可以使用以下函数将指定的日期时间值从协调世界时(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();
    });
  }
};
此函数类似于来自SharePoint API的函数

用法


您的代码在哪里?如何设置日期?很可能您正在发送本地日期时间值(DateTimeKind.local)服务器在保存之前必须更改的。即使SP保存了本地时间,如果服务器的时区与您的代码不同,您仍然会收到相同的错误。请使用
ToUtc
创建带有
DateTimeKind.UTC
的值,或者使用
DateTimeOffset
避免任何歧义。顺便说一句,我认为SP的服务使用ISO8601(相当于datetimeoffset),这意味着当本地
DateTime
转换为
2016-10-20T00:00:00+02:00
-ISO8601格式的正确本地时间时,时间被您的代码修改。我正在SharePoint UI中编辑SharePoint列表项。这是我从逻辑应用程序操作得到的响应:“body”:{[…为了简洁而减少…]“orderdate”:“2016-10-19”}对于这个令人敬畏的答案,我的问题是,我将sharepoint中的字段配置为“仅日期”。在内部,日期仍然存储为datetime,但响应中省略了时间部分。但返回的值仍然基于UTC。如果响应缺少时间部分,则无法转换为任何其他时区。我现在更改了sharepoint配置,以包括日期和时间。
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));
});