.NET Web Service中的DateTime转换行为不一致

时间:2015-12-27 11:48:34

标签: c# asp.net .net datetime sharepoint

问题

我的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()总是从它运行的机器的区域设置中获得默认值。

1 个答案:

答案 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日解析。