波斯日期转公历C#代码报错求助:PersianCalendar相关错误排查
修复波斯日期转公历日期的C#编译错误
逐个错误修复说明
1. CS0128:变量名重复
代码中先后定义了PersianCalendar a和DateTime a,同一作用域内变量名冲突。将PersianCalendar实例的变量名改为pc,DateTime变量名改为visitDateTime即可解决。
2. CS0103:未定义PC变量
代码中调用PC.ToDateTime,但并未声明PC变量。应该使用刚才创建的PersianCalendar实例pc来调用ToDateTime方法。
3. CS0029:类型转换错误
因变量名重复导致DateTime变量被错误关联到PersianCalendar类型,修复变量名后该错误自动消失。
4. CS7036:参数不匹配
原代码中若a是PersianCalendar实例,调用AddMinutes会触发Calendar.AddMinutes(DateTime, int)方法(需要两个参数),但我们需要的是DateTime.AddMinutes(double)方法。修复变量名后,visitDateTime是DateTime类型,直接调用AddMinutes(Duration)即可,DateTime.AddMinutes支持传入double类型参数。
额外潜在问题修复
pid != ""的判断存在空引用风险,应改为!string.IsNullOrEmpty(pid)。- 自定义扩展类
PersianToEnglish中,直接遍历字符串并Replace会因string不可变导致效率低下,改用StringBuilder优化。
修复后的完整代码
业务代码
public ActionResult addvisit(int docid, int visitid, string visitdatetime, string pid) { int intpid = 0; if (!string.IsNullOrEmpty(pid)) { var p = context.Table_Patient.Where(x => x.NationalCode == pid).SingleOrDefault(); if (p == null) { return Json(new { status = 2, nv = 0 }, JsonRequestBehavior.AllowGet); //no NationalCode } else { intpid = p.pkID; } } string[] vdatetime = visitdatetime.Split(' '); string[] vdate = vdatetime[0].Split('/'); string[] vtime = vdatetime[1].Split(':'); int y = MyExtensions.PersianToEnglish(vdate[0]); int m = MyExtensions.PersianToEnglish(vdate[1]); int d = MyExtensions.PersianToEnglish(vdate[2]); int h = MyExtensions.PersianToEnglish(vtime[0]); int min = MyExtensions.PersianToEnglish(vtime[1]); // 修复变量名冲突,改为pc PersianCalendar pc = new PersianCalendar(); // 使用pc实例调用ToDateTime,变量名改为visitDateTime DateTime visitDateTime = pc.ToDateTime(y, m, d, h, min, 0, 0); Double Duration = context.View_PerDoctorsID.Where(x => x.fkDocID == docid && x.fkVisitID == visitid).Select(x => x.Duration).Single(); Table_Visit nv = new Table_Visit(); nv.fkDocID = docid; nv.SDate = visitDateTime; // DateTime.AddMinutes接受double参数,直接传入Duration即可 nv.EDate = visitDateTime.AddMinutes(Duration); if (string.IsNullOrEmpty(pid)) { nv.fkPID = null; } else { nv.fkPID = intpid; } nv.fkVisitStatus = 1; nv.fkVTID = visitid; var thisvisit = context.View_Visit.Where(x => x.fkDocID == docid && x.fkVTID == visitid && x.SDate == nv.SDate && x.EDate == nv.EDate).SingleOrDefault(); // 此处可添加后续逻辑,比如判断thisvisit是否存在,保存到数据库等 // 示例: // if(thisvisit == null) // { // context.Table_Visit.Add(nv); // context.SaveChanges(); // return Json(new { status = 1, nv = nv.pkID }, JsonRequestBehavior.AllowGet); // } // else // { // return Json(new { status = 3, nv = 0 }, JsonRequestBehavior.AllowGet); // 已存在 // } }
优化后的自定义扩展类
public static class MyExtensions { public static int PersianToEnglish(this string persianStr) { if (string.IsNullOrEmpty(persianStr)) throw new ArgumentNullException(nameof(persianStr)); Dictionary<char, char> LettersDictionary = new Dictionary<char, char> { ['۰'] = '0', ['۱'] = '1', ['۲'] = '2', ['۳'] = '3', ['۴'] = '4', ['۵'] = '5', ['۶'] = '6', ['۷'] = '7', ['۸'] = '8', ['۹'] = '9', ['0'] = '0', ['1'] = '1', ['2'] = '2', ['3'] = '3', ['4'] = '4', ['5'] = '5', ['6'] = '6', ['7'] = '7', ['8'] = '8', ['9'] = '9' }; StringBuilder sb = new StringBuilder(persianStr); for (int i = 0; i < sb.Length; i++) { if (LettersDictionary.TryGetValue(sb[i], out char replaceChar)) { sb[i] = replaceChar; } } return int.Parse(sb.ToString()); } }
内容的提问来源于stack exchange,提问作者Ali norouzi
相关产品推荐
相关产品推荐

