「MM/dd/yyyy hh:mm」の形式を指定していますが、文字列はその形式ではありません。
「GMT-0400 (Eastern Daylight Time)」の部分に問題があると思われます。残りは「ddd MMM dd yyyy HH:mm:ss」または「ddd MMM d yyyy HH:mm:ss」の形式になっています。 "月日番号が常に 2 桁ではない場合。
UTC からのオフセットを個別にDateTimeOffset
解析し、最初の部分 (GMT の前) を未指定 DateTime
として解析し、オフセットを解析することをお勧めします。編集:オフセットを解析できTimeSpan.ParseExact
ますが、自分で記号を処理する必要があると思います-そのように負のタイムスパンを解析する文書化された方法は見当たりません:(
編集:私の野田時間プロジェクトでは、たとえば「'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
これは、実際には東部時間ではなく、固定のタイムゾーンでを与えることに注意してください。現在、ノダタイムには がありませんOffsetDateTime
。これは、ここに自然に適合します...