C# 转换ddd-MMM-dd-HH:mm:ss';东部标准时间';yyyy格式?
在我看来,我正在返回一个字符串,该字符串正在我的控制器中转换为日期时间。字符串格式为“ddd-MMM-dd-HH:mm:ss'EST'yyyy” 我正在成功地将其转换为:C# 转换ddd-MMM-dd-HH:mm:ss';东部标准时间';yyyy格式?,c#,asp.net-mvc,datetime,C#,Asp.net Mvc,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); 问
var startDate = DateTime.ParseExact(_startDate, "ddd MMM dd HH:mm:ss 'EST' yyyy", CultureInfo.InvariantCulture);
model.StartDate = Convert.ToDateTime(startDate);
问题是时区可以是任何东西。我该怎么解释呢?情况并非总是如此,它将是'EST'
。例如,如果它是EDT,它将抛出一个异常
示例输入字符串为:2017年美国东部时间2月20日星期一00:00:00
编辑:它也可以是格式ddd MMM d HH:mm:ss'EST'yyyy
这将只在美国和加拿大时区使用。在我的控制器中,我现在执行以下操作
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;
我将引述:
快速的回答是,你做不到
(这里有一个关于你为什么不能……的解释,我不会在这里复制)
因此,我可以给你一种方法,将时区提取为字符串
,然后你可以做任何你想做的事情(例如,你可以有一本字典
…这不是一个很好的主意,但可能会更糟,但请看:俄罗斯在过去4年中多次更改DST规则)
使用
现在tx==“EST”
和dt
是2017-02-20 01:02:00
带有Kind==未定义的
缩写的其他相关答案:。您能否提供一些示例输入,说明当变量已经是DateTime
时调用Convert.ToDateTime
的原因可能重复?@GlobalJim-为什么不?您清楚地知道字符串的确切格式,但这3个字符除外。只需将它们从\u startDate
子串出来即可。顺便说一句,EST
或EDT
不是时区名称。唯一标准化的时区名称是IANA时区数据库中的名称。如果您使用ISO8601格式,而不是使用这些缩写,那么会容易得多。
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);