有没有办法通过Web服务获得Sharepoint站点的区域设置?

时间:2010-11-24 10:30:32

标签: web-services sharepoint timezone wss locale

我查看了wss 3.0文档,但我找不到任何内容。我想使用Web服务检索Sharepoint 2007站点的区域设置(无法访问服务器,因此无法在其上部署任何内容),以便了解配置的站点的时区。这可能吗?

THX

2 个答案:

答案 0 :(得分:1)

好的,这就是我要解决的问题:

  • 查询列表中的1个元素,为网站的区域设置设置时间
  • 查询该元素,获取UTC时间
  • 计算2个结果之间的差异。

代码:

    /// <summary>
    /// Gets the difference between local time and UTC to calculate offset.
    /// Makes a query to the list that returns 1 element with times using the locale as set in the site's settings.
    /// Then makes another query for the same element with UTC times to calculate the difference.
    /// </summary>
    /// <param name="list">list to query</param>
    /// <param name="client">WS object</param>
    /// <returns>Time offset as TimeSpan object</returns>
    private TimeSpan getSiteTZOffset(List list, WSLists.Lists client )
    {
        //Set up query parameters
        XmlDocument xmlDoc = new XmlDocument();
        XmlNode emptyQuery = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "");
        XmlNode queryWithID = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "");

        XmlNode ndOptions = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "");
        ndOptions.InnerXml = "<DateInUtc>True</DateInUtc>";

        XmlNamespaceManager xnm = new XmlNamespaceManager(xmlDoc.NameTable);
        xnm.AddNamespace("z", "#RowsetSchema");

        // Gets the attribute that serves as modified date
        MapAttribute modifiedDateAttr = attributes.Single(x => x.Value.DateTimeModifiedField).Value;
        // Gets the Id attribute
        MapAttribute idAttr = attributes.Single(x => x.Value.KeyReference).Value;

        //Get 1 result with site's local time
        XmlNode resLocalTime = client.GetListItems(list.ListID, list.ViewID, emptyQuery, null, "1", null, null);
        XmlNodeList itemsLocalTime = resLocalTime.SelectNodes("//z:row", xnm);

        // 2nd query filters on ID of the item returned by 1st query
        queryWithID.InnerXml = string.Format("<Where><Eq><FieldRef Name='ID' /><Value Type='Counter'>{0}</Value></Eq></Where>",
            itemsLocalTime[0].Attributes[idAttr.Name].Value);

        //get the result with UTC time
        XmlNode resUtc = client.GetListItems(list.ListID, list.ViewID, queryWithID, null, "1", ndOptions, null);
        XmlNodeList itemsUtc = resUtc.SelectNodes("//z:row", xnm);

        //Converts string values to DateTime objects
        DateTime localTime = DateTime.Parse(itemsLocalTime[0].Attributes[modifiedDateAttr.Name].Value);
        DateTime utcTime = getUtcTime(itemsUtc[0].Attributes[modifiedDateAttr.Name].Value);
        // Gets offset
        TimeSpan offset = localTime - utcTime;

        return offset;
    }

答案 1 :(得分:1)

可以通过GetList Web服务的Lists方法获取SharePoint网站的时区。询问有关列表的信息以获取网站的区域设置似乎很奇怪,但就是这样: - )

这是关于单个列表的方法响应的摘录:

<List>
  ...
  <RegionalSettings>
    <Language>1033</Language>
    <Locale>1033</Locale>
    <AdvanceHijri>0</AdvanceHijri>
    <CalendarType>1</CalendarType>
    <Time24>False</Time24>
    <TimeZone>-60</TimeZone>
    <SortOrder>2070</SortOrder>
    <Presence>True</Presence>
  </RegionalSettings>
  ...
</List>

时区以偏移量返回到UTC时间(以分钟为单位)。如果将其添加到网站本地时区的时间,您将获得UTC时区的时间。 (如果您想获得正确的值,则必须考虑夏令时的变化并根据时间段应用它们。)。

// Instantiate the web service. Don't forget to dispose it later.
// Append the web service suffix (/_vti_bin/Lists.asmx) to the URL
// of the web site which time zone of you are interested in.
// If you don't use IWA or the current user has no access to the
// web site set the service.Credentials instead.
var service = new Lists();
service.Url = "http://myhost/sites/mysite/_vti_bin/Lists.asmx";
service.UseDefaultCredentials = true;
// Get all lists from the web site you want to get the time zone of.
// Get the XML element at /Lists/List[1]. It can be any accessible list.
// We will use just the unique list identifier from the atribute ID.
var lists = service.GetListCollection();
var list = lists.ChildNodes.OfType<XmlElement>().FirstOrDefault();
if (list == null)
    throw new ApplicationException("The web has no lists.");
// Get information about the list which a little about the web too.
// Get the XML element at /List/RegionalSettings/TimeZone.
list = (XmlElement) service.GetList(list.GetAttribute("ID"));
var regionalSettings = list.ChildNodes.OfType<XmlElement>().First(
    item => item.LocalName == "RegionalSettings");
var timeZone = regionalSettings.ChildNodes.OfType<XmlElement>().First(
    item => item.LocalName == "TimeZone");
// The offset can be added to the time in the web site local time zone
// to get the UTC time. For example, UTC+1 has the offset -60 minutes.
var utcOffset = new TimeSpan(0, int.Parse(timeZone.InnerText), 0);

---费达