【问题标题】:How to convert SharePoint Date-Only field from UTC to local time zone如何将 SharePoint 仅日期字段从 UTC 转换为本地时区
【发布时间】:2016-11-03 14:52:20
【问题描述】:

我创建了一个逻辑应用程序,它使用 get-item 操作从 SharePoint Online 读取数据。

但是 - 我有一个 Date-Only 类型的 sharepoint-column,它显然只返回日期部分(正如 date-only 所暗示的那样)。

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

所以现在 logic-app-action 正在发送一个 rest-call,它将返回 2016-10-19。那么我应该如何获得我的原始日期呢?即使我将响应视为 UTC 并将其转换为我的本地时间(使用天蓝色函数),我也会得到 2016-10-19T02:00.00 而不是 2016-10-20T02:00.00

【问题讨论】:

  • 你的代码在哪里?你是如何设置日期的?您很可能正在发送服务器必须在保存之前更改的本地日期时间值 (DateTimeKind.Local)。即使 SP 保存了本地时间,如果服务器的时区与您的代码不同,您仍然会收到相同的错误。使用ToUtcDateTimeKind.UTC 创建一个值,或使用DateTimeOffset 以避免任何歧义
  • 顺便说一句,我认为 SP 的服务使用 ISO8601(相当于 datetimeoffset),这意味着当本地 DateTime 转换为 2016-10-20T00:00:00+02:00 时,您的代码修改了时间 - ISO8601 中的正确本地时间格式
  • 我正在 SharePoint-UI 中编辑 SharePoint 列表项。这是我从 logic-app-action 得到的响应:“body”:{ [...为简洁而减少 ...]“orderdate”:“2016-10-19”}

标签: rest azure sharepoint azure-logic-apps


【解决方案1】:

在创建或更新条目时,SharePoint 会转换(基于在站点 Regional Settings 中选择的当前 Time Zone)并将日期时间值保存为协调世界时 (UTC)。 SharePoint Online REST 服务以 UTC 格式返回日期时间(Office 365 中的其他服务除外,例如可以通过 Prefer: outlook.timezone 标头控制的 Outlook 服务,有关更多详细信息,请参见例如 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();
    });
  }
};

此函数类似于 SharePoint API 中的SPTimeZone.LocalTimeToUTC method

用法

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));
}); 

【讨论】:

  • 感谢这个很棒的答案 - 但我的问题是,我将 sharepoint 中的字段配置为“仅限日期”。内部日期仍然存储为日期时间,但响应中省略了时间部分。但返回值仍然基于 UTC。如果响应缺少时间部分,这使得无法转换到任何其他时区。我现在更改了共享点配置以包括日期时间。
  • @nyn3x 您是否找到了仅日期字段的解决方案?我不想在这些字段中向用户显示时间,但有与您相同的时区问题。因此,用户显示的日期始终与字段中存储的 UTC 值相同,这是错误的,因为区域设置的时区 DST 始终与 UTC 不同。
猜你喜欢
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
相关资源
最近更新 更多