C# 转换ddd-MMM-dd-HH:mm:ss';东部标准时间';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); 问

在我看来,我正在返回一个字符串,该字符串正在我的控制器中转换为日期时间。字符串格式为“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,它将抛出一个异常

示例输入字符串为:
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);