Строка не была распознана как допустимое значение DateTime, но она без проблем работает на другом сервере. - PullRequest
0 голосов
/ 04 февраля 2020

Мой текущий сервер Win 2008 R2 мигрирует на Azure. Так что я перевожу веб-приложение на Azure Server Win 2008 R2.

В настоящее время я сталкиваюсь с проблемой, когда оно показывает

«Сообщение»: «Строка не была распознана как действительный DateTime. "," StackTrace ":" в System.DateTimeParse.Parse (String s, DateTimeFormatInfo dtfi, DateTimeStyles стили) \ r \ n в System.Convert.ToDateTime (String value) \ r \ n в ... `

Назначение кода: Это библиотека JQGrid. Если код выполняется успешно, я продолжу обновлять таблицу. Этот код запускается, когда пользователь нажимает кнопку обновления и перед обновлением таблицы в качестве проверки даты.

Странный вопрос: мой On-Prem сервер выполняет этот код гладко, все данные в Azure и On-Prem сервере одинаковы.

NEWDDED: Когда я редактирую некоторые строки (пока только 1 строка из 100), это работает.

Детали рабочих строк: Working row details

Не рабочие детали строк : Not working row details

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#:

    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;
    }

Ответы [ 4 ]

1 голос
/ 04 февраля 2020

Как упоминалось в комментарии ранее, проблема может быть в разных культурах. Использование InvariantCulture в вашем коде может помочь. Больше информации здесь: https://docs.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo.invariantculture?view=netframework-4.8

0 голосов
/ 04 февраля 2020

Зная некоторые знания о различных культурах в формате DateTime, из комментария вопроса я перешел к поиску того, как сделать его таким же, как мой локальный сервер, на новый azure сервер (, потому что у меня есть уже разработал рабочий код на моем локальном сервере ). Обнаружил, что я могу просто изменить настройку «Регион и язык» так же, как в помещении на azure. Ниже ссылка, которую я использовал.

Вот ссылка: Откуда CultureInfo.CurrentCulture читает культуру

0 голосов
/ 04 февраля 2020

Измените ваши строки:

    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

Если у вас есть Date в JS, и вы используете toJSON, он должен вернуть строку в " гггг-мм-ддтчч: мм: ссз "- см. " правильный "JSON формат даты для дальнейшего обсуждения

0 голосов
/ 04 февраля 2020

Вот ваша проблема: Convert.ToDateTime.

Вот исходный код этого метода:

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

Как видите, он использует текущую культуру для разбора строки.

То, что вы должны использовать, это DateTime.TryParseExact или, по крайней мере, DateTime.ParseExact и предоставить точный формат и правильную информацию о культуре, которую вы '' пытается разобраться с DateTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...