在我看来,我正在返回一个字符串,该字符串在我的控制器中被转换为DateTime。字符串格式为" ddd MMM dd HH:mm:ss' EST' YYYY"
我正在成功转换它:
var startDate = DateTime.ParseExact(_startDate, "ddd MMM dd HH:mm:ss 'EST' yyyy", CultureInfo.InvariantCulture);
model.StartDate = Convert.ToDateTime(startDate);
问题是时区可能是任何东西。我怎么能解释这个?并非总是如此'EST'
。如果它是EDT,例如它将抛出异常。
示例输入字符串为:Mon Feb 20 00:00:00 EST 2017
编辑:它也可以是格式ddd MMM d HH:mm:ss 'EST' yyyy
这只会在美国和加拿大的时区使用。
答案 0 :(得分:1)
在我的控制器中,我现在执行以下操作。
var startDateTZ = _startDate.Substring(20, 4);
if (startDateTZ[3] == ' ')
{
startDateTZ = _startDate.Substring(20, 3);
}
if (startDateTZ.Length > 3)
{
if (startDateTZ[3] == '0')
{
startDateTZ = _startDate.Substring(19, 4);
}
if (startDateTZ[3] == '2')
{
startDateTZ = _startDate.Substring(19, 3);
}
}
var startDate = new DateTime();
if (_startDate[9] != ' ')
{
startDate = DateTime.ParseExact(_startDate, "ddd MMM dd HH:mm:ss '" + startDateTZ + "' yyyy", CultureInfo.InvariantCulture);
}
else
{
startDate = DateTime.ParseExact(_startDate, "ddd MMM d HH:mm:ss '" + startDateTZ + "' yyyy", CultureInfo.InvariantCulture);
}
model.StartDate = startDate;
答案 1 :(得分:1)
我引用here:
快速回答是,你不能这样做。
(有一个原因可以解释为什么你不能......我不会在这里复制它)
所以我能给你的是一种将时区提取为string
的方法,然后你就可以做任何你想要的事情(例如你可以有一个Dictionary<string, offset>
......不是一个好主意,但可能会更糟,但请参阅this comment:俄罗斯在过去4年中多次更改了DST规则)
public static bool TryParseDateTimeWithTimeZone(string s, out DateTime result, out string timeZone)
{
if (s == null)
{
throw new NullReferenceException("s");
}
int ixEnd = s.LastIndexOf(' ');
if (ixEnd == -1 || ixEnd == 0)
{
throw new FormatException();
}
int ixStart = s.LastIndexOf(' ', ixEnd - 1);
if (ixStart == -1)
{
throw new FormatException();
}
timeZone = s.Substring(ixStart + 1, ixEnd - ixStart - 1);
string s2 = s.Remove(ixStart) + s.Substring(ixEnd);
bool success = DateTime.TryParseExact(s2, "ddd MMM dd HH:mm:ss yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result);
if (!success)
{
timeZone = null;
}
return success;
}
使用
DateTime dt;
string tz;
bool success = TryParseDateTimeWithTimeZone("Mon Feb 20 01:02:00 EST 2017", out dt, out tz);
现在tx == "EST"
和dt
2017-02-20 01:02:00
为Kind == Undefined
。
缩写的其他相关答案:Timezone Abbreviations。