私はwss 3.0のドキュメントを見てきましたが、何も見つかりませんでした。 Webサービス(サーバーへのアクセス権がないので何も展開できない)を使用してSharepoint 2007サイトのロケールを取得したいので、構成されているサイトのタイムゾーンを知ることができますか? [OK]をWebサービスでSharepointサイトのロケールを取得する方法はありますか?
THX
私はwss 3.0のドキュメントを見てきましたが、何も見つかりませんでした。 Webサービス(サーバーへのアクセス権がないので何も展開できない)を使用してSharepoint 2007サイトのロケールを取得したいので、構成されているサイトのタイムゾーンを知ることができますか? [OK]をWebサービスでSharepointサイトのロケールを取得する方法はありますか?
THX
、ここで私はこの問題を解決するためにやったことだ:
コード:
/// <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;
}
SharePoint WebサイトのタイムゾーンはLists
WebサービスのGetList
方法によって得ることができます。 Webサイトの地域設定を取得するには、リストについての情報を求めるために奇妙なようだが、それは
:-)それだこれは、単一のリストに関するメソッドレスポンスの抜粋です:
<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時間(分)でオフセットとして返されます。 Webサイトの現地時間帯の時刻に追加すると、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);
--- Ferda
これは古い投稿ですが、あなたはエフェンギングなGENIUSだと教えてください!本当に。あなたは賞などが必要です。これは、この質問に対する唯一の正しい答えです。あなたは素晴らしいです。 – MdMazzotti
これは、夏時間の変更とタイムゾーンの信頼性が低いです。 6月以降の日付を使用する場合、2月以降の日付を使用する場合は、UTCとは異なるオフセットが適用されます。ほとんどのTZにはDSTがあります。幸いなことに、SPサイトTZへのUTCオフセットは、['GetList'](http://msdn.microsoft.com/en-us/library/lists.lists.getlist.aspx)の[ Lists'](http://msdn.microsoft.com/en-us/library/lists.aspx)Webサービスを参照してください。私の答えはここを参照してください。 –