您指定的格式为 `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
,这很适合这里......