繁体   English   中英

在C#中无法将字符串识别为有效的DateTime?

[英]String was not recognized as a valid DateTime in c#?

我已经使用linq在c#中为日期范围过滤器编写了此代码,但是在服务器上出现错误。 在我的本地计算机上,代码运行良好,但是在服务器上部署时却出现错误。

这是我的代码:

string fromDate = "15-03-2017";
string toDate = "17-03-2017";
DateTime FromDate = Convert.ToDateTime(fromDate);
DateTime ToDate = Convert.ToDateTime(toDate);                        
UserList = db.Users
    .Where(t => DbFunctions.TruncateTime(t.datetime) >= FromDate 
             && DbFunctions.TruncateTime(t.datetime) <= ToDate)
    .OrderByDescending(a => a.datetime)
    .ToList();

我不知道我的错误在此查询中。 如果有人知道,请告诉我如何解决此问题。 在我的本地计算机上,代码运行良好,但在服务器上却出现错误。

您所使用的方法取决于当前线程的当前区域性-以及系统时区。

您最好在我的视图中使用DateTime.ParseExact ,并可能指定DateTimeStyles值来强制使用UTC。 简单解析:

// Names changed to follow .NET naming conventions
CultureInfo invariantCulture = CultureInfo.InvariantCulture;
DateTime fromDateTime = DateTime.ParseExact(fromDate, "dd-MM-yyyy", invariantCulture);
DateTime toDateTime = DateTime.ParseExact(toDate, "dd-MM-yyyy", invariantCulture);

指定不变的区域性意味着您不会意外地像在非格里高利历中指定的那样对日期进行解析。

请注意,这是一种不常见的格式-如果可以使用ISO-8601格式,那将是更好的IMO。

我还建议您,如果您要进行大量的日期/时间工作,请考虑我的Noda Time项目,该项目使您不必担心日期的时区,因为它只是一个日期,因此生活变得更加简单。您将这些字符串解析为LocalDate值。

您要么应确保您的字符串符合ISO 8601格式(日期的格式为yyyy-MM-dd)。

string fromDate = "2017-03-15";
string toDate = "2017-03-17";
DateTime FromDate = Convert.ToDateTime(fromDate);

或使用DateTime.ParseExact指定字符串的格式:

string fromDate = "15-03-2017";
string toDate = "17-03-2017";
DateTime FromDate = 
    DateTime.ParseExact(fromDate, "dd-MM-yyyy", CultureInfo.InvariantCulture)

请注意,可以避免使用DbFunctions.TruncateTime 第一个条件检查t.datetime是与FromDate是同一天还是之后:

DbFunctions.TruncateTime(t.datetime) >= FromDate

如果您不截断时间,它将给出相同的结果。 如果t.datetime具有更大的日期,则在这种情况下,截断时间不会改变任何内容。 如果日期相同,则截断时间只会将条件结果从“更大”更改为“等于”。 第二个条件是检查t.datetime是否与ToDate在同一天或该天之前:

DbFunctions.TruncateTime(t.datetime) <= ToDate

如果您检查t.date是否小于ToDate旁边的天,将会得到相同的结果。 因此查询将如下所示:

DateTime FromDate = Convert.ToDateTime(fromDate);
DateTime ToDate = Convert.ToDateTime(toDate).AddDays(1);                        
UserList = db.Users
     .Where(u => u.datetime >= FromDate && u.datetime < ToDate)
     .OrderByDescending(u => u.datetime)
     .ToList();

我认为您的服务器和本地有不同的区域。 您可以使用DateTime.ParseExact修复此问题。 下面给出的例子; 编辑您的需求

DateTime dt=DateTime.ParseExact("15-03-2017", "dd-MM-yyyy", CultureInfo.InvariantCulture);

那将适用于所有地区并解决您的问题

您是否尝试过使用CultureInfo? 来自服务器的用户文化信息,例如,我正在使用美国文化信息。

DateTimeFormatInfo usCinfo = new CultureInfo("en-US", false).DateTimeFormat;
DateTime fromDate = Convert.ToDateTime("12/01/2011", usCinfo)

系统上的语言(本地和服务器)可能有所不同。 解析日期和数字时,应明确提供格式信息/区域性信息/格式字符串,以避免此类问题。 有多种方法可以执行此操作,例如,一种可以与您的代码一起使用的方法:

string toDate = "17-03-2017";
DateTimeFormatInfo formatInfo = new DateTimeFormatInfo();
formatInfo.ShortDatePattern = "dd-MM-yyyy";
formatInfo.DateSeparator = "-";
DateTime ToDate = Convert.ToDateTime(toDate, formatInfo);

编辑:从您在评论中提供的内容到问题,可能是日期分隔符不正确的问题。 这在使用英语的系统上会发生,无论提供什么格式的字符串,在解析日期字符串时,分隔符都设置为“ /”。 解决此问题的一种方法是提供这样的日期: "03-17-2017" (请注意,此处的月份在“ Day "MM/dd/yyyy"之前提供,格式为"MM/dd/yyyy"而不是"dd/MM/yyyy" 。另一种方法是提供日期分隔符:

formatInfo.DateSeparator = "-";

如果不是,那么问题可能与TruncateTime()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM