更新我的解决方案:
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();
有什么想法吗?我在那里有三元运算符因为我还需要处理空字符串。
答案 0 :(得分:4)
您可以根据空间拆分字符串,然后根据结果数组中的Take(3)
元素拆分,使用string.Join
加入,然后使用DateTime.ParseExact
或DateTime.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答案。