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

本文关键字:转换 换行 不一致 DateTime Web 服务 NET | 更新日期: 2023-09-27 18:28:13

问题

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

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

首先,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日。