You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Microsoft.Graph 4.40.0获取SharePoint列表用户输入的原始日期

在Microsoft Graph 4.40.0中获取与用户输入一致的SharePoint日期及区域设置

此前使用Microsoft.SharePoint.CSOM库从SharePoint获取时区信息并转换日期,确保得到与用户输入完全一致的日期,代码如下:

var ctx = new ClientContext(siteUrl);
var spTimeZone = ctx.Web.RegionalSettings.TimeZone;
ctx.Load(spTimeZone);

// 解析为System.TimeZoneInfo
var fixedTimeZoneName = spTimeZone.Description.Replace("and", "&");
var timeZoneInfo = TimeZoneInfo.GetSystemTimeZones().FirstOrDefault(tz => tz.DisplayName == fixedTimeZoneName);
var dayItems = items.Select(x => x.FieldValues).ToList();
var date = (DateTime)dayItems.First()["ApplicableDay"];
var specifiedDate = TimeZoneInfo.ConvertTimeFromUtc(relevantGasDay, timeZone);

现在改用Microsoft Graph 4.40.0获取列表项,代码如下:

var ctx = new GraphServiceClient(_tokenCredential);
var listQuery = ctx.Sites[site].Lists[listName];
var list = await listQuery.Request().GetAsync();
var queryOptions = new List<QueryOption>()
{
    new QueryOption("expand", "fields")
};
var listItems = await listQuery.Items.Request(queryOptions).GetAsync();
var dayItems = listItems.Select(listItem => listItem.Fields.AdditionalData);
var date = dayItems.First()["ApplicableDay"];

其中AdditionalData以字典形式存储列表行数据,包含日期字段。需要实现获取与用户输入完全一致的日期,同时想了解如何通过Graph获取区域设置。


解决方案

步骤1:获取SharePoint网站的区域设置(时区)

通过Graph请求网站的regionalSettings即可获取时区信息,示例代码:

// 获取网站区域设置
var siteRegionalSettings = await ctx.Sites[site].RegionalSettings.Request().GetAsync();
var spTimeZoneId = siteRegionalSettings.TimeZone.Id;
var spTimeZoneDisplayName = siteRegionalSettings.TimeZone.DisplayName;

// 转换为System.TimeZoneInfo
TimeZoneInfo timeZoneInfo = null;
try
{
    // 优先通过时区ID匹配(兼容性更好)
    timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(spTimeZoneId);
}
catch (TimeZoneNotFoundException)
{
    // 边缘场景下用显示名称匹配,对齐CSOM逻辑
    var fixedDisplayName = spTimeZoneDisplayName.Replace("and", "&");
    timeZoneInfo = TimeZoneInfo.GetSystemTimeZones().FirstOrDefault(tz => tz.DisplayName == fixedDisplayName);
}

步骤2:转换日期为网站时区的本地时间

Graph返回的日期默认是UTC格式,需转换为网站时区的本地时间,才能和用户输入的日期一致:

// 从AdditionalData中提取并解析日期
var dateValue = dayItems.First()["ApplicableDay"];
DateTimeOffset utcDate;

if (dateValue is DateTimeOffset dto)
{
    utcDate = dto;
}
else if (!DateTimeOffset.TryParse(dateValue.ToString(), out utcDate))
{
    throw new InvalidOperationException("无法解析日期字段");
}

// 转换为网站时区的本地时间
var localDate = TimeZoneInfo.ConvertTime(utcDate, timeZoneInfo);
// 若仅需日期部分,取Date属性即可
var applicableDay = localDate.Date;

补充说明

  • SharePoint时区ID大部分与Windows系统时区ID一致,优先用FindSystemTimeZoneById匹配;
  • 请求regionalSettings需具备Sites.Read.All或更高权限;
  • 转换逻辑对齐原CSOM代码,确保日期结果与用户输入完全一致。

内容的提问来源于stack exchange,提问作者Serhii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:01:34