我的Windows应用程序使用SharePoint托管的Web服务与服务器同步。 当应用程序使用LAN同步到服务器(通过内部代理服务器)时,所有DateTime格式都是dd / MM / yyyy格式(这是它的目的) 但是,当应用程序超过4G同步时,所有DateTime格式都是MM / dd / yyyy格式 对于所有入站和出站数据都会发生这种情况。
Windows Server 2012与SharePoint 2013托管SOAP服务
地区:新加坡
格式:英语(新加坡)
Windows 10平板电脑应用程序
地区:新加坡
格式:英语(新加坡)
其他信息:
1.这是在WiFi和4G上使用的平板电脑,所以我们可以统治
2个具有不同区域设置的平板电脑。
2.我已经验证了Windows 10应用程序正确传递了格式,而且服务器在WiFi和4G上的行为有所不同。
3.我相信这个问题是由.NET本身引起的,而不是因为SharePoint引起的。但是,我不想排除它,因为我不确定实际原因。如果您认为由于SharePoint而导致需要任何进一步的信息,请发表评论
我已经跳过了代码段中的using语句和SPWeb语句,以保持简单。和DateTime类型的SPList中的LastModifiedTime字段,而不是单行文本。
public class Record
{
public string ID {get; set}
public string ModifiedDateTime {get; set;} //Don't ask why it is not a DateTime object. It was too late by the time I took over
}
public class WebService : IWebService
{
public List<Record> GetUpdates(string lastModifiedTime)
{
SPQuery query= QueryBuilder.GetUpdateQuery(lastModifiedDateTime);
SPList spRecordList = spWeb.Lists["Record"];
SPListItemCollection results = spRecordList.GetItems(query);
List<Record> records = new List<Record>();
foreach(SPListItem spRecord in results)
{
Record record = new Record();
record.ID = spRecord.ID.ToString();
record.ModifiedDateTime = Convert.ToString(spRecord["LastModifiedTime"]);
//1 June 2015 would return as 01/06/2015 in WiFi but 06/01/2015 on 4G
records.Add(record);
}
return records;
}
public Record CreateOrUpdateRecord(Record record)
{
SPListItem spRecord = null;
SPList spRecordList = spWeb.Lists["Record"];
if(string.IsNullOrEmpty(record.ID))
{
spRecord = spRecordList.AddItem();
record.ID = spRecord.ID.ToString();
}
else
{
spRecord = spRecordList.GetItemByID(record.ID);
}
DateTime modified = Convert.ToDateTime(record.Modified);
spRecord["LastModifiedTime"] = modified;
/*
Say ModifiedDateTime is 1 June 2015.
Then on WiFi, modified = 01/06/2015
On 4G, modified = 06/01/2015
*/
return record;
}
}
现在,我在字符串和DateTime之间转换时使用格式字符串修复了问题,反之亦然。或多或少,我现在已经开始工作了。
所以我的问题是,这种行为背后的原因是什么?如果可能,请引用文档链接或解释此行为的任何其他来源的参考文献
服务器是否可能从请求标头中推断出文化信息?我一直认为DateTime.Parse()/ Convert.ToDateTime()总是从它运行的机器的区域设置中获得默认值。
答案 0 :(得分:2)
首先,DateTime
没有任何隐式格式。它只有日期和时间值。格式概念仅适用于 textual (字符串)表示。我强烈建议您将此数据类型从string
更改为DateTime
,前提是可以通过网络服务返回。
我已经确认Windows 10应用程序正确地传递了格式 它是服务器,在WiFi和4G上表现不同
没有这样的事情。将字符串解析为DateTime或反之,不取决于您连接到Internet的方式。这完全取决于文化背景。
因为你用它;
DateTime modified = Convert.ToDateTime(record.Modified);
默认情况下,此代码将使用CurrentCulture
设置 。既然你说过;
这是在WiFi和4G上使用的平板电脑,所以我们可以统治 2个具有不同区域设置的平板电脑
一个区域设置将您的字符串解析为1月6日,其他设置将您的字符串解析为6月1日。这太正常了。看起来一个设置使用dd/MM/yyyy
格式,而另一个设置使用MM/dd/yyyy
。
作为解决方案,您可以使用DateTime.ParseExact
方法指定与您的字符串匹配的完全文化。或者您可以在平板电脑上均衡区域设置。
例如;
DateTime dt = DateTime.ParseExact("01/06/2015", "dd/MM/yyyy", CultureInfo.InvariantCulture);
将在2015年6月1日解析,但
DateTime dt = DateTime.ParseExact("01/06/2015", "MM/dd/yyyy", CultureInfo.InvariantCulture);
将于2015年1月6日解析。