使用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
相关产品推荐
相关产品推荐

