String 未被识别为有效的 DateTime - 但它在另一台服务器上运行顺利

String was not recognized as a valid DateTime - but it runs smoothly in another server

我当前的 Win 2008 R2 服务器正在迁移到 Azure。所以我将 Web 应用程序移动到 Azure Server Win 2008 R2。

目前,我遇到了显示的问题

"Message":"String was not recognized as a valid DateTime.","StackTrace":" at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)\r\n at System.Convert.ToDateTime(String value)\r\n at... `

代码用途:一个JQGrid库,如果代码运行成功,我会继续更新一个table。当用户单击更新按钮并在更新 table 作为日期验证之前运行此代码。

奇怪的问题是:我的 On-Prem 服务器顺利运行这段代码,Azure 和 On-Prem 服务器中的所有数据都是相同的。

新添加: 当我编辑一些行时(到目前为止只有 100 行中的 1 行),它起作用了。

工作行详细信息:

无效行详细信息:

JQuery 代码片段:

        closeAfterEdit: true,
        closeOnEscape: true,
        reloadAfterSubmit: true,
        url: '/SFI/WebService/StaffMaster.asmx/CheckEditStaff_AssignedRoster',
        ajaxEditOptions: { contentType: 'application/json; charset=utf-8' },
        mtype: 'post',
        datatype: 'json',
        serializeEditData: function (postData) {
            var PrivilegeID = $('#hdnMAPrivilegeID').val();
            eStaffID = $("#StaffID").val();
            eStaffNo = $("#StaffNo").val(),
            eNewEndDate = $("#EffectiveEnd").val();
            eStaffName = $("#StaffName").val(),
            eIdentificationNo = $("#IdentificationNo").val(),
            eDOB = $("#DOB").val(),
            eEffectiveStart = $("#EffectiveStart").val(),
            eEffectiveEnd = $("#EffectiveEnd").val(),
            eGradeCode = $("#GradeDetails").val(),
            eStaffType = $("#StaffType").val(),
            eOrgUnit = $("#OrgUnit").val(),
            eEmail= $("#Email").val().toLowerCase()

            return JSON.stringify(
            {
                StaffID: $("#StaffID").val(),
                NewEndDate: $("#EffectiveEnd").val(),
                OldEndDate: StaffOldEndDte
            });
            .
            .
            .
            StaffOldEndDte = $("#EffectiveEnd").val();

C# 中的 Web 服务调用:

    public string CheckEditStaff_AssignedRoster(string StaffID,string NewEndDate,string OldEndDate)
    {
        string status = "0";
        bool Changed = false;
        DateTime dtnew;
        DateTime dtOld;

        dtnew = Convert.ToDateTime(NewEndDate);
        dtOld = Convert.ToDateTime(OldEndDate);


        if ((dtOld != dtnew)  && (dtnew < dtOld))
        {                
            Changed = true;
        }
        else
        {
            status = "1";
        }

        if (Changed)
        {                
            if (some condition...)
            {
                .
                .
                //do something...
            }
            else
            {
                status = "1";
            }
        }

        return status;
    }

正如之前评论中提到的,不同的文化可能是问题所在。在您的代码中使用 InvariantCulture 可能会有所帮助。更多信息在这里:https://docs.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo.invariantculture?view=netframework-4.8

这是你的问题:Convert.ToDateTime

这里是这个方法的source code

public static DateTime ToDateTime(String value) {
    if (value == null)
        return new DateTime(0);
    return DateTime.Parse(value, CultureInfo.CurrentCulture);
}

如您所见,它使用当前区域性来解析字符串。

您应该使用的是 DateTime.TryParseExact or at least DateTime.ParseExact 并为其提供您尝试解析为 DateTime.

的确切格式和正确的文化信息

更改台词:

    dtnew = Convert.ToDateTime(NewEndDate);
    dtOld = Convert.ToDateTime(OldEndDate);

    dtnew = DateTime.ParseExact(NewEndDate, "yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture); //or however your JS is formatting the date as string
    dtOld = DateTime.ParseExact(OldEndDate, "yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture); //or however your JS is formatting the date as string

如果你在 JS 中有一个 Date 并且你使用 toJSON 它应该 return 一个 "yyyy-MM-ddTHH:mm:ssZ" 中的字符串 - 请参阅 The "right" JSON date format 了解更多讨论

在了解了有关 DateTime 格式的不同文化的一些知识后,从问题的评论中,我再次搜索如何使其与我的本地服务器相同到新的 azure 服务器(因为我已经在我的本地服务器中开发了一个工作代码)。发现,我可以将与内部部署相同的 'Region and Language' 设置更改为 azure。下面是我用的link

这是link:From where CultureInfo.CurrentCulture reads culture