在TimeZone中,SharePoint Online保存DateTime日期

时间:2018-02-23 17:50:29

标签: datetime sharepoint-online

我在网上搜索过但未找到TimeZone在SharePoint中保存数据库中DateTime对象的问题的答案。使用C#或PowerShell将日期返回给我时,他们总是休息一天。我的时区是W.Europe Standard Time。 (瑞典斯德哥尔摩)如果我想与今天的日期进行比较,我应该如何转换返回日期?

  

更新

我设法从您的示例中构建了这段PowerShell代码。但它无法找到TimeZone。我做错了什么?

$strCurrentTimeZone = (Get-WmiObject win32_timezone).StandardName $TZ = [System.TimeZoneInfo]::FindSystemTimeZoneById($strCurrentTimeZone)//<--False to find TimeZoneById $LocalTime = [System.TimeZoneInfo]::ConvertTimeFromUtc($SharePointTime, $TZ)

2 个答案:

答案 0 :(得分:0)

我有同样的问题。

我使用以下代码行在CSOM(C#)中解决了这个问题:

//Retrieve the date value from SP (1 day off in your case)
DateTime spDate = Convert.ToDateTime(spItem["DateField"]); 

//Retrieve the timezone from the SharePoint web
var spTimeZone = context.Web.RegionalSettings.TimeZone;
context.Load(spTimeZone);
context.ExecuteQuery();

//Get the System.TimeZoneInfo from Microsoft.SharePoint.Client.TimeZone
var fixedTimeZoneName = spTimeZone.Description.Replace("and", "&");
var timeZoneInfo = TimeZoneInfo.GetSystemTimeZones().Where(tz => tz.DisplayName == fixedTimeZoneName).FirstOrDefault();

//Setting the DateTimeKind to Unspecified (otherwise the last function could return an error)
spDate = DateTime.SpecifyKind(spDate, DateTimeKind.Unspecified);

//Getting destination timezone for the new Date
var europeanTimeZone = TimeZoneInfo.GetSystemTimeZones().Where(t => t.Id == "W. Europe Standard Time").FirstOrDefault();

//Converting the DateTime to your 'W.Europe Standard Time' timezone
DateTime correctDateTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(spDate, timeZoneInfo.Id, europeanTimeZone.Id); 

这可以解决您的问题。

答案 1 :(得分:0)

SharePoint以UTC格式存储日期时间字段值,并在用户检索时将其转换为适当的时区。但是,使用SharePoint API时,返回的日期是UTC格式,必须转换为本地时间。

C#/ PowerShell 日期时间可以通过TimeZone.ToLocalTime Method转换为当地时间,例如:

 var list = ctx.Web.Lists.GetByTitle(listTitle);
 var item = list.GetItemById(itemId);
 ctx.Load(item);
 ctx.ExecuteQuery();

 var created = (DateTime)item["Created"];
 var createdLoc = System.TimeZone.CurrentTimeZone.ToLocalTime(created);