问题
我有一个Windows应用程序使用SharePoint托管的Web服务与服务器同步。当应用程序使用LAN(通过内部代理服务器)同步到服务器时,所有DateTime格式都是dd/MM/yyyy格式(这就是它的预期格式)
然而,当应用程序通过4G同步时,所有DateTime格式都是MM/dd/yyyy格式
所有入站和出站数据都会发生这种情况。
服务器
带有SharePoint 2013的Windows Server 2012承载SOAP服务
地区:新加坡
格式:英文(新加坡)
客户
Windows 10平板电脑应用程序
地区:新加坡
格式:英文(新加坡)
其他信息:
1.这是WiFi和4G上使用的同一款平板电脑,所以我们可以裁定出2个具有不同区域设置的平板电脑
2.我已经验证了Windows 10应用程序是否正确通过了格式,并且是服务器在WiFi和4G上表现不同
3.我认为这个问题是由.NET本身引起的,而不是由SharePoint引起的。然而,我不想排除这种可能性,因为我不确定实际原因。如果您认为这是由SharePoint 引起的,如果您需要任何进一步的信息,请发表评论
代码段:
为了简单起见,我跳过了代码段中的using语句和SPWeb语句。以及SPList中类型为DateTime而非单行文本的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
}
Web服务
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()总是从它运行的机器的区域设置中获得默认值。
首先,DateTime
没有任何隐式格式。它只有日期和时间值。只有当您获得文本(字符串)表示时,格式概念才适用。如果可以通过web服务返回,我强烈建议将此数据类型从string
更改为DateTime
。
我已经验证了Windows 10应用程序是否正确通过了格式是服务器在WiFi和4G 上表现不同
根本不存在这样的事情。将字符串解析为DateTime或反之亦然是否不取决于您连接到互联网的方式。这一切都与文化背景有关。
既然你用它作为;
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日。