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
我当前的 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