DateTimeオブジェクトをISO8601文字列に変換しようとしていますが、間違った結果が出続けています。私はstackoverflowを見回しましたが、適切な解決策を見つけることができませんでした。
私は "2017-06-26T20:45:00.070Z"の日付時刻文字列で開始します。これはjsonからnewtonsoftによって逆シリアル化され、C#のDateTimeオブジェクトに変換されます。
var theTime = new DateTime(2017, 6, 26, 20, 45, 00, 70, DateTimeKind.Utc);
今、別のアルゴリズムで使用するには、その時間を元のUTC形式の文字列に戻す必要がありますが、私が試みるすべての変換は元の文字列に戻りません。何が間違っているのかわかりません。
私はもう試した:
var newTime = theTime.UtcNow.ToString("o");
// returns "2017-06-26T00:00:00.0000000Z"
var newTime2 = theTime.Date.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.sssZ");
// returns "2017-06-26T00:00:00.00Z"
私は何が間違っていますか?私はjsがtoISOString()を使用して行うことと同等のものを求めています。これはnewTime2日付時刻形式でリストしたものですが、時刻も表示していません。
ありがとう!
観察する:
_// Your input
DateTime dt = new DateTime(2017, 6, 26, 20, 45, 0, 70, DateTimeKind.Utc);
// ISO8601 with 7 decimal places
string s1 = dt.ToString("o", CultureInfo.InvariantCulture);
//=> "2017-06-26T20:45:00.0700000Z"
// ISO8601 with 3 decimal places
string s2 = dt.ToString("yyyy-MM-dd'T'HH:mm:ss.fffK", CultureInfo.InvariantCulture);
//=> "2017-06-26T20:45:00.070Z"
_
いくつかのこと:
フォーマット文字列でZ
を使用しないでください。これは 有効な形式指定子 ではないため、出力する単なる文字として扱われます。入力日時の_.Kind
_設定に関係なく、すべての文字列に含まれます。
DateTime
では、K
を使用します。これは、Z
を_.Kind
_の出力に追加することで_DateTimeKind.Utc
_を適切に伝達します。 _DateTimeKind.Local
_、または_DateTimeKind.Unspecified
_にはまったく何もありません。
T
は有効な書式指定子ではないため、文字として出力されますが、それらについては常に明示的にすることをお勧めします。したがって、_'T'
_をお勧めします。
fff
を使用すると、常に3桁の小数(ミリ秒)が返されます。ゼロのときに小数点を省略したい場合は、代わりにFFF
を使用します。 sss
の使用は無効です。
_CultureInfo.InvariantCulture
_を渡すことは、現在のカルチャが別のカレンダーシステムを使用する可能性がある問題を回避するのに役立つため、良い習慣です。たとえば、_ar-SA
_は、ISO 8601で必要とされる予測的なグレゴリオ暦ではなく、UmAlQuraCalendar
を使用します。
試したコードで、_theTime.UtcNow
_を呼び出しました-コンパイルされません。 UtcNow
は、インスタンスプロパティではなく、静的プロパティです。
また、コードでtheTime.Date.ToUniveralTime()
を呼び出しました-どちらもしないでください。 _.Date
_は時間コンポーネントをゼロに設定し、入力値にはすでに_DateTimeKind.Utc
_があるため、.ToUniversalTime()
は効果がありません。
問題は、UTC
やUniversalTime
などの文化的標準を使用すると精度が低下することです。 DateTime
を単に印刷する場合:
var theTime = new DateTime(2017, 6, 26, 20, 45, 00, 70,
DateTimeKind.Utc);
Console.WriteLine(theTime);
6/26/2017 8:45:00 PM
この問題の詳細については、こちらをご覧ください こちら 。
解決策は、「文化」を使用しないことです。 (たとえば、UniversalTime
、またはUtcNow
)。これらの文化的基準にはミリ秒が含まれることはありません...人々が実際にミリ秒ほど頻繁に気にする文化はないからです。
解決策:
var newTime = theTime.ToString("o");
Console.WriteLine(newTime);
2017-06-26T20:45:00.0700000Z