在ddd MMM中转换DateTime字符串dd HH:mm:ss' EST' yyyy格式?

时间:2017-03-15 13:38:03

标签: c# asp.net-mvc datetime

在我看来,我正在返回一个字符串,该字符串在我的控制器中被转换为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 这只会在美国和加拿大的时区使用。

2 个答案:

答案 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:00Kind == Undefined

缩写的其他相关答案:Timezone Abbreviations