2010-11-24 45 views

Répondre

1

Ok, voici ce que je l'ai fait pour résoudre ce:

  • faire une requête à la liste pour 1 élément, obtenir les temps de réglage pour les paramètres régionaux de votre site
  • faire une requête pour cet élément , obtenir des temps en UTC
  • calculer la différence entre les 2 résultats.

code:

/// <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; 
    } 
+0

Ce ne sont pas fiables pour les fuseaux horaires avec des changements d'économie de la lumière du jour. Vous obtiendrez un décalage différent à UTC lors de l'utilisation de la date de février que lorsque vous utilisez une date à partir de Juin. La plupart des TZ ont l'heure d'été. Heureusement, le décalage UTC du site SP TZ peut être obtenu par la méthode ['GetList'] (http://msdn.microsoft.com/en-us/library/lists.lists.getlist.aspx) de [' Lists'] (http://msdn.microsoft.com/en-us/library/lists.aspx) service web. Voir ma réponse ici. –

1

Le fuseau horaire d'un site Web SharePoint peut être obtenue par la méthode GetList du service Web Lists. Il semble bizarre de demander des informations sur une liste pour obtenir les paramètres régionaux d'un site Web, mais qu'il est :-)

Voici un extrait de la réponse de la méthode sur une seule liste:

<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> 

Le temps La zone est renvoyée sous la forme d'un décalé par rapport à l'heure UTC en minutes. Si vous l'ajoutez à l'heure dans le fuseau horaire local du site, vous obtiendrez l'heure dans le fuseau horaire UTC. (Si vous voulez obtenir la bonne valeur, vous devrez considérer les changements de l'heure d'été et les appliquer en fonction de la saison.).

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

--- Ferda

+0

Bien que ce soit un vieux post, laissez-moi vous dire que vous êtes un GENEUS effing! Vraiment. Vous méritez un prix ou quelque chose. CECI EST LA SEULE RÉPONSE CORRECTE à cette question. Tu es incroyable. – MdMazzotti