1
 string value =     "Sat Apr 28 2012 11:00:00 GMT-0400 (Eastern Daylight Time)"

我需要转换为日期时间

我试着做:

 DateTime datetime = DateTime.ParseExact(value, "MM/dd/yyyy hh:mm", null);

或者

 DateTime datetime2 = Convert.ToDateTime(value);

例外:字符串未被识别为有效的日期时间。

4

5 回答 5

3

您指定的格式为 `MM/dd/yyyy hh:mm" 但您的字符串甚至不是那种格式

我怀疑您在使用“GMT-0400(东部夏令时间)”部分时会遇到问题 - 其余部分的格式为“ddd MMM dd yyyy HH:mm:ss”或“ddd MMM d yyyy HH:mm:ss” " 如果月份中的日期不总是两位数。

我建议您分别解析来自 UTC 的偏移量,并创建一个DateTimeOffset- 将第一部分(在 GMT 之前)解析为未指定 DateTime- 然后解析偏移量。编辑:您可以解析偏移量,TimeSpan.ParseExact但您需要自己处理符号,我相信 - 我看不到任何有记录的方式来解析负时间跨度:(

编辑:请注意,我的Noda Time项目允许您解析偏移部分,例如使用“'GMT'+HHmm”模式 - 显然我们会处理这LocalDateTime部分 - 但您仍然需要将不同的部分分开字符串的各个部分相互分离。示例代码:

using System;
using System.Linq;
using System.Xml.Linq;
using NodaTime;
using NodaTime.Text;

public class Test
{
    static void Main()
    {
        string text = "Sat Apr 28 2012 11:00:00 GMT-0400 (Eastern Daylight Time)";
        ZonedDateTime parsed = Parse(text);
        Console.WriteLine(parsed);
    }

    static readonly LocalDateTimePattern LocalPattern =
        LocalDateTimePattern.CreateWithInvariantInfo("ddd MMM d yyyy HH:mm:ss");

    // Note: Includes space before GMT for convenience later
    static readonly OffsetPattern OffsetPattern =
        OffsetPattern.CreateWithInvariantInfo("' GMT'+HHmm");

    static ZonedDateTime Parse(string text)
    {
        int gmtIndex = text.IndexOf(" GMT");
        int zoneIndex = text.IndexOf(" (");
        // TODO: Validation that these aren't -1 :)

        string localText = text.Substring(0, gmtIndex);
        string offsetText = text.Substring(gmtIndex, zoneIndex - gmtIndex);

        var localResult = LocalPattern.Parse(localText);
        var offsetResult = OffsetPattern.Parse(offsetText);

        // TODO: Validate that both are successful

        var fixedZone = DateTimeZone.ForOffset(offsetResult.Value);        
        return localResult.Value.InZoneStrictly(fixedZone);
    }
}

请注意,这将给出一个ZonedDateTime固定区 - 不是真正的东部时间。目前 Noda Time 没有OffsetDateTime,这很适合这里......

于 2012-04-17T19:05:23.187 回答
3

尝试以下操作:

Convert.ToDateTime("Sat Apr 28 2012 11:00:00 GMT-0400 (Eastern Daylight Time)".Substring(4, 20))
于 2012-04-17T19:11:33.360 回答
2

您的字符串与您的格式不匹配。

在尝试转换之前,您需要稍微解析该字符串。例如,可以解析“Apr 28 2012 11:00:00”。但是,您需要自己转换其余部分。

您可能想考虑使用DateTimeOffset 这里记录的,因为它可以保持相对于 UTC 的时间,就像您的字符串一样。

发现这是文档,非常接近您所拥有的

// Parse date and time with custom specifier.
dateString = "Sun 15 Jun 2008 8:30 AM -06:00";
format = "ddd dd MMM yyyy h:mm tt zzz";
try
{
    result = DateTimeOffset.ParseExact(dateString, format, provider);
    Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
}
catch (FormatException)
{
   Console.WriteLine("{0} is not in the correct format.", dateString);
} 
于 2012-04-17T19:08:55.933 回答
1

尝试ddd MMM d yyyy hh:mm:ss zzz

如果它不工作试试这个

于 2012-04-17T19:08:35.497 回答
1

如果您查看Custom Date and Time Format Strings,您所拥有的只是这种格式的一种变体:

"ddd MMM dd yyyy h:mm:ss zzz"

里面只有一些额外的部分:

"ddd MMM dd yyyy h:mm:ss GMTzzz (blah blah blah)"

如果你处理这些,你应该没问题:

value = value.Remove(value.IndexOf(" ("));
DateTime datetime = DateTime.ParseExact(value, "ddd MMM dd yyyy hh:mm:ss \"GMT\"zzz", null);
于 2012-04-17T19:17:47.980 回答