私は自分のNoda Timeプロジェクトを個人的に使用します。(確かに私は作者として偏見がありますが、それはよりきれいになるでしょう...)しかし、あなたがそれを行うことができない場合...
DateTime.ParseExact
期待する正確な形式を指定して使用し、解析コードにDateTimeStyles.AssumeUniversal
とを含めます。DateTimeStyles.AdjustToUniversal
using System;
using System.Globalization;
class Test
{
static void Main()
{
var date = DateTime.ParseExact("2012-09-30T23:00:00.0000000Z",
"yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal |
DateTimeStyles.AdjustToUniversal);
Console.WriteLine(date);
Console.WriteLine(date.Kind);
}
}
(なぜデフォルトでローカルに調整されるのかAdjustToUniversal
は私にはわかりませんが、気にしないでください...)
編集: mattytommo の提案に対する私の異議を拡張するために、情報が失われることを証明することを目指しました。私はこれまで失敗してきましたが、非常に奇妙な方法で。これを見てください - ヨーロッパ/ロンドンのタイム ゾーンで実行され、時計は 2012 年 10 月 28 日の現地時間午前 2 時 (UTC 午前 1 時) に戻ります。
DateTime local1 = DateTime.Parse("2012-10-28T00:30:00.0000000Z");
DateTime local2 = DateTime.Parse("2012-10-28T01:30:00.0000000Z");
Console.WriteLine(local1 == local2); // True
DateTime utc1 = TimeZoneInfo.ConvertTimeToUtc(local1);
DateTime utc2 = TimeZoneInfo.ConvertTimeToUtc(local2);
Console.WriteLine(utc1 == utc2); // False. Hmm.
「DSTの有無にかかわらず」フラグがどこかに保存されているようですが、どこに解決できれば私は吹き飛ばされます. TimeZoneInfo.ConvertTimeToUtc
状態のドキュメント
dateTimeがあいまいな時間に対応する場合、このメソッドはそれがソース タイム ゾーンの標準時間であると想定します。
変換するとき、ここではそうではないようlocal2
です...
編集:わかりました、さらに奇妙になります-使用しているフレームワークのバージョンによって異なります。このプログラムを考えてみましょう:
using System;
using System.Globalization;
class Test
{
static void Main()
{
DateTime local1 = DateTime.Parse("2012-10-28T00:30:00.0000000Z");
DateTime local2 = DateTime.Parse("2012-10-28T01:30:00.0000000Z");
DateTime utc1 = TimeZoneInfo.ConvertTimeToUtc(local1);
DateTime utc2 = TimeZoneInfo.ConvertTimeToUtc(local2);
Console.WriteLine(utc1);
Console.WriteLine(utc2);
DateTime utc3 = local1.ToUniversalTime();
DateTime utc4 = local2.ToUniversalTime();
Console.WriteLine(utc3);
Console.WriteLine(utc4);
}
}
したがって、これは 2 つの異なるUTC 値を取得し、それらを で解析してDateTime.Parse
から、2 つの異なる方法でそれらを UTC に変換します。
.NET 3.5 での結果:
28/10/2012 01:30:00 // Look - we've lost information
28/10/2012 01:30:00
28/10/2012 00:30:00 // But ToUniversalTime() seems okay...
28/10/2012 01:30:00
.NET 4.5 ベータ版での結果:
28/10/2012 00:30:00 // It's okay!
28/10/2012 01:30:00
28/10/2012 00:30:00
28/10/2012 01:30:00