将异常字符串转换为DateTime而不使用foreach

时间:2014-10-06 18:55:55

标签: c# linq date-conversion

更新我的解决方案:

var rowsToAdd = (from t in dtEntry.AsEnumerable().Cast<DataRow>()
                 let startDate = (
                 t.Field<string>("StartDate").Length > 0)
                     ? DateTime.Parse(t.Field<string>("StartDate").Split(new Char [] {'('})[0], CultureInfo.InvariantCulture)
                     : DateTime.Today.AddMonths(-3)
                 where startDate > filterDate
                 select t);

原始问题: 我从外部API获取一个DateTime字符串,如下所示:

10/14/2014 8:30 AM (America/Los Angeles)

我将所有数据都放在一个名为dtEntry的数据表中,我在下面使用它。

内置的c#DateTime转换函数似乎都不起作用。它们都会导致格式化。有谁知道我怎么做到这一点?另一个问题是我正在使用LINQ(见下文)。

DataRow[] rows = (from t in dtEntry.AsEnumerable().Cast<DataRow>()
                       let startDate = (
                       t.Field<string>("StartDate").Length > 0)
                           ? DateTime.Parse(t.Field<string>("StartDate"))
                           : DateTime.Today.AddMonths(-3)
                       where startDate > filterDate
                       select t).ToArray();                                       

有什么想法吗?我在那里有三元运算符因为我还需要处理空字符串。

2 个答案:

答案 0 :(得分:4)

您可以根据空间拆分字符串,然后根据结果数组中的Take(3)元素拆分,使用string.Join加入,然后使用DateTime.ParseExactDateTime.TryParseExact,如:< / p>

string str = "10/14/2014 8:30 AM (America/Los Angeles)";
string newStr = string.Join(" ", str.Split().Take(3));

DateTime parsingDateTime;
if (!DateTime.TryParseExact(newStr, "M/d/yyyy h:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None,
    out parsingDateTime))
{
    //invalid datetime
}

编辑:你必须忽略(America/Los Angeles)字符串的一部分,否则无法使用这样的字符串进行解析。您可以find TimeZone for Region然后为该参数创建DateTime。请参阅:Get timezone by Country and Region

答案 1 :(得分:2)

接受的答案没有考虑时区部分。我的假设是时区是标准时区标识符,可以从Unicode.org site翻译。基于这个提供来自Unicode.org网站的辅助方法的其他SO Answer (.NET TimeZoneInfo from Olson time zone),您可以将api时间解析为您的时间:

string apiTime = "10/14/2014 8:30 AM (America/Los Angeles)";

int timeZoneStart = apiTime.IndexOf('(');

string timeZonePart = apiTime.Substring(timeZoneStart)
    .Replace("(", string.Empty) // remove parenthesis
    .Replace(")", string.Empty) // remove parenthesis
    .Trim() // clear any other whitespace
    .Replace(" ", "_"); // standard tz uses underscores for spaces
    // (America/Los Angeles) will become America/Los_Angeles

string datePart = apiTime.Substring(0, timeZoneStart).Trim();

DateTime apiDate = DateTime.Parse(datePart);

TimeZoneInfo tzi = OlsonTimeZoneToTimeZoneInfo(timeZonePart);

DateTime apiDateTimeConverted = TimeZoneInfo.ConvertTime(apiDate, tzi);

上面的方法,OlsonTimeZoneToTimeZoneInfo,来自上面链接的SO答案。