私は最初の完全な C# プロジェクトに取り組んでいます。Windows ストア アプリ/Windows Phone アプリ用のポータブル クラス ライブラリを作成していますが、実際には DateTime.ParseExact と DateTime.TryParseExact だけで問題が発生しています。
DateTime に変換しようとしている文字列は、実際には Zulu にあります。例は次のようになります。
2012-09-14T04:42:25.117Z
2012-08-17T04:39:51.215Z
ご覧のとおり、ここではミリ秒単位で表示されます。使用されているコードは次のとおりです。
DateTime _createdAt = DateTime.ParseExact(dateTime, TIMEFORMATTER,
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal);
return _createdAt;
そして TIMEFORMATTER は、上で宣言された const です。
const string TIMEFORMATTER = "yyyy-MM-ddTHH:mm:ss.fffZ"
私はそれを解決する何かを探して、多くのSOの投稿を読んでいます。私はこれがうまくいくだろうと考えましたが、そうではありませんでした。
誰かが私を正しい方向に向けることができれば、私はそれを感謝します. 私はVB.netのDateオブジェクトだけを扱ってきました。
編集:完全な説明を表示するためにライブラリから追加のコードを追加する
if (details.ContainsKey("created_at"))
{
var time = details["created_at"].Stringify();
Debug.WriteLine(time);
DateTime _createdAt = FormatDateTime(time);
Debug.WriteLine(_createdAt.ToLocalTime());
Asana.Projects[indexOfProject].CreatedAt = _createdAt;
}
public static DateTime FormatDateTime(string dateTime)
{
DateTime _createdAt = new DateTime();
// 2012-09-14T04:42:25.117Z
DateTime.TryParse(dateTime, out _createdAt);
return _createdAt;
}
これはデバッグに行くものです:
"2012-08-17T04:39:52.878Z"
1/1/0001 12:00:00 AM
"2012-08-17T05:17:12.530Z"
1/1/0001 12:00:00 AM
"2012-09-09T04:23:08.805Z"
1/1/0001 12:00:00 AM
"2012-08-17T04:39:51.215Z"
1/1/0001 12:00:00 AM
"2012-09-14T05:12:22.056Z"
1/1/0001 12:00:00 AM
"2012-08-06T04:51:10.662Z"
1/1/0001 12:00:00 AM
"2012-09-14T04:40:56.602Z"
1/1/0001 12:00:00 AM
"2012-08-17T04:52:33.264Z"
1/1/0001 12:00:00 AM
"2012-09-14T04:43:50.953Z"
1/1/0001 12:00:00 AM
"2012-09-13T06:07:16.530Z"
1/1/0001 12:00:00 AM
"2012-09-14T04:42:25.117Z"
1/1/0001 12:00:00 AM
解決
Jeremy Thompson の助けを借りて、実際に自分のミスをデバッグすることができました。.NetでもJSONデータを扱うのはこれが初めてであることがわかりました(Pythonに慣れていました)。
.Stringify() と .GetString() は、文字列のテキストを取得する場合、まったく異なることを行います。新しいコンソール プログラムを開き、Jeremy のコードを使用して、彼と同じ結果を生成しました。完璧に動作しました。ライブラリに戻ったとき、返された文字列の一部でフォーマットの問題が発生していました。その後、デバッグ ウィンドウで JSON データを引用符で囲んでいることに気付きました。
新しい作業コードは次のとおりです。
// From the depths of a method
if (details.ContainsKey("created_at"))
{
var time = details["created_at"].GetString();
DateTime _createdAt = FormatDateTime(time);
Asana.Projects[indexOfProject].CreatedAt = _createdAt;
Debug.WriteLine(Asana.Projects[indexOfProject].CreatedAt.ToLocalTime());
}
そして、新しい FormatDateTime メソッド (結局のところ、それほど新しいものではありません...):
public static DateTime FormatDateTime(string dateTime)
{
DateTime _createdAt = new DateTime();
DateTime.TryParseExact(dateTime, TIMEFORMATTER, CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal, out _createdAt);
return _createdAt;
}
入力/出力の例:
2012-09-14T04:43:42.060Z
9/13/2012 10:43:42 PM
2012-09-09T04:23:08.805Z
9/8/2012 10:23:08 PM
2012-08-06T04:51:10.662Z
8/5/2012 10:51:10 PM
見てくださった方、考えてくださった方、本当にありがとうございます。