将异常字符串转换为DateTime w/out foreach

本文关键字:out foreach DateTime 异常 字符串 转换 | 更新日期: 2023-09-27 18:25:47

更新我的解决方案:

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();                                       

有什么想法吗?我有三元运算符,因为我也需要处理空字符串。

将异常字符串转换为DateTime w/out foreach

您可以根据空间分割字符串,然后从结果数组中分割Take(3)元素,使用string.Join将它们连接回来,然后使用DateTime.ParseExactDateTime.TryParseExact,如:

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
}

EDIT:您必须忽略字符串的(America/Los Angeles)部分,否则无法使用这样的字符串进行解析。您可以为Region找到TimeZone,然后为该参数创建DateTime。请参阅:按国家和地区获取时区

接受的答案不考虑时区部分。我的假设是,时区是一个标准时区标识符,可以从Unicode.org网站翻译。基于另一个SO Answer(Olson时区的.NET TimeZoneInfo),它从Unicode.org网站提供了一个助手方法,然后您可以将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答案。