0

私は最初の完全な 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

見てくださった方、考えてくださった方、本当にありがとうございます。

4

1 に答える 1

0
string stringdate = "2012-09-14T04:42:25.117Z";
DateTime date = new DateTime();
DateTime.TryParse(stringdate,out date);
MessageBox.Show(date.ToShortDateString());

例えば:

MessageBox.Show(date.ToLocalTime().ToString());

ここに画像の説明を入力

編集:

MSDN DateTime.TryParseExact Methodで:

文字列パラメーターは、デフォルト値を使用して解析されます。format に存在する以外の空白は許可されません。文字列に日付コンポーネントがない場合、返される DateTime 値の日付は 1/1/0001 に設定されます。

Date コンポーネントを提供しているようです。私の唯一の推測では、私はオーストラリアにいて、動作しており、DD-MM-YYYY を使用しており、米国では MM-DD-YYYY を使用しています。おそらくそれをひっくり返して、それが機能するかどうかを確認してください。

"2012-17-08T04:39:52.878Z"

于 2013-02-06T05:07:46.130 に答える