2017-06-23 8 views
1

この日付(「Jira」REST APIの結果 - >ワークログ - >開始フィールド)から、期待した結果と異なる結果を返す質問があります。正しいDateTimeに変換

質問:

  1. どのような種類/日付形式の種類は、このですか?
  2. 異なる結果が返されるのはなぜですか? 文字列日付:2017-06-20T22:09:00.000から0400 C#DateTime.Parse結果:{2017年6月21日午前10時09分○○秒AM}

あなたが変換する正しい方法を提供していただけますこれは正しい時間に?

+0

ような何か。 –

+2

@MichałTurczynこれはISOです。 ISOが標準でない場合、標準は何もありません:) –

答えて

2

これはISO形式です。特定のタイムゾーンでの瞬間を表す、最も好ましい曖昧な日付形式です。

2017-06-20T22:09:00.000-0400は、2017年6月20日を表します。22:09 PM in time zone GMT -4。

ISO形式は、C#を含むほとんどの言語で正しく解析されます。

コードに別の値が表示される理由は、GMT + 8に位置し、GMT -4月20日午後2時9分、ローカル時間が6月21日午前10時09分であるためです。
これは絶対に有効で期待される動作です。

+0

最近では、ISO 8601の '2017-06-22T24:00:00.000'が正しい日付であり、この時点ではc#によって解析されないケースがありました。 C#は完全に失われ、例外がスローされます。 – Jimbot

+0

@Jimbot 24:00:00?それはうるう秒ケースですか? –

+0

いいえ、ISO 8601で完全に大丈夫ですが、仕様をチェックしましたが、Cではありません。#...深夜の翌日を意味します:1995-02-04 24:00 = 1995-02-05 00:00 – Jimbot

0

時差とGMTオフセットがしばしば混乱につながります。

まず、「ここ8時15分」とはどういう意味ですか? GMT?ロンドン?どこか別の場所?次に、「GMT + 2」は何を意味していますか?

最初のケースでは正直な答えはもう少しの文脈なしでは伝えることができないということです。 2番目のケースでは、GMTオフセットを誤解している人々にとってはより多くの人がいる - 多くの人々は、「GMT == London」というように「GMT + 2 == London + 2」 - (GMT + 1)==夏のロンドン "したがって、「GMT + 2」は「GMT + 2」です。つまり、夏のベルリンや冬のニコシアのような場所です。

これらの理由から、時間が重要な多くの状況では、GMTまたは別のタイムゾーンを使用しますが、オフセットを明示する必要があります。 "3:15 am、EDT"

あなたは

  • は、あなたがやっているもので、タイムゾーンを許可いくつかのオプションを持っているあなたの質問に答えるために、 GMTに変えて作業を簡単にすると、GMT + 4ではなくGMT +/-をやっています。
  • また、answerと同じ行に沿って何かを行うことができます。

フォーマットが標準ではないので、私は、カスタムパーサーを記述します。この

DateTimeOffset date = new DateTimeOffset(2017, 6, 20, 22, 09, 0, 0, TimeSpan.FromHours(-4)); 
// 20 June 2017, 22:09, GMT-4 

public static DateTimeOffset ParseIso8601(string iso8601String) 
{ 
    return DateTimeOffset.ParseExact(
     iso8601String, 
     new string[] { "yyyy-MM-dd'T'HH:mm:ss.FFFK" }, 
     CultureInfo.InvariantCulture, 
     DateTimeStyles.None); 
}