与えられた:
DateTime.UtcNow
ISO 8601準拠の形式で同じ値を表す文字列を取得するにはどうすればよいですか?
ISO 8601 では、多くの同様の形式が定義されていることに注意してください。私が探している特定の形式は次のとおりです。
yyyy-MM-ddTHH:mm:ssZ
与えられた:
DateTime.UtcNow
ISO 8601準拠の形式で同じ値を表す文字列を取得するにはどうすればよいですか?
ISO 8601 では、多くの同様の形式が定義されていることに注意してください。私が探している特定の形式は次のとおりです。
yyyy-MM-ddTHH:mm:ssZ
読者への注意:何人かのコメント作成者が、この回答のいくつかの問題を指摘しています (特に最初の提案に関連しています)。詳細については、コメント セクションを参照してください。
DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz");
カスタムの日時形式を使用すると、
2008-09-22T13:57:31.2311892-04:00のような日付になります。
別の方法は次のとおりです。
DateTime.UtcNow.ToString("o");
標準の「往復」スタイル(ISO 8601)を使用して
2008-09-22T14:01:54.9571247Zを提供します。
指定された形式を取得するには、次を使用できます。
DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")
DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)
「s」形式指定子はソート可能な日付/時刻パターンとして記述されているため、探しているものを提供する必要があります。ISO8601に準拠しています。
編集:Z
OP が必要とするように最後に追加を取得するには、"o"
代わりに を使用し"s"
ます。
DateTime.UtcNow.ToString("s")
2008-04-10T06:30:00 のようなものを返します
UtcNow
明らかにUTC時刻を返すため、以下に害はありません。
string.Concat(DateTime.UtcNow.ToString("s"), "Z")
使用する:
private void TimeFormats()
{
DateTime localTime = DateTime.Now;
DateTime utcTime = DateTime.UtcNow;
DateTimeOffset localTimeAndOffset = new DateTimeOffset(localTime, TimeZoneInfo.Local.GetUtcOffset(localTime));
//UTC
string strUtcTime_o = utcTime.ToString("o");
string strUtcTime_s = utcTime.ToString("s");
string strUtcTime_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");
//Local
string strLocalTimeAndOffset_o = localTimeAndOffset.ToString("o");
string strLocalTimeAndOffset_s = localTimeAndOffset.ToString("s");
string strLocalTimeAndOffset_custom = utcTime.ToString("yyyy-MM-ddTHH:mm:ssK");
//Output
Response.Write("<br/>UTC<br/>");
Response.Write("strUtcTime_o: " + strUtcTime_o + "<br/>");
Response.Write("strUtcTime_s: " + strUtcTime_s + "<br/>");
Response.Write("strUtcTime_custom: " + strUtcTime_custom + "<br/>");
Response.Write("<br/>Local Time<br/>");
Response.Write("strLocalTimeAndOffset_o: " + strLocalTimeAndOffset_o + "<br/>");
Response.Write("strLocalTimeAndOffset_s: " + strLocalTimeAndOffset_s + "<br/>");
Response.Write("strLocalTimeAndOffset_custom: " + strLocalTimeAndOffset_custom + "<br/>");
}
UTC
strUtcTime_o: 2012-09-17T22:02:51.4021600Z
strUtcTime_s: 2012-09-17T22:02:51
strUtcTime_custom: 2012-09-17T22:02:51Z
Local Time
strLocalTimeAndOffset_o: 2012-09-17T15:02:51.4021600-07:00
strLocalTimeAndOffset_s: 2012-09-17T15:02:51
strLocalTimeAndOffset_custom: 2012-09-17T22:02:51Z
標準の日付と時刻の書式文字列(MSDN)
カスタムの日付と時刻の書式文字列(MSDN)
System.DateTime.UtcNow.ToString("o")
=>
val it : string = "2013-10-13T13:03:50.2950037Z"
「ラウンドトリップ ("O") 形式指定子」を含むいくつかのオプションがあります。
var date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString("O"));
Console.WriteLine(date1.ToString("s", System.Globalization.CultureInfo.InvariantCulture));
出力
2008-03-01T07:00:00.0000000
2008-03-01T07:00:00
ただし、DateTime + TimeZone は、ブログ投稿DateTime and DateTimeOffset in .NET: Good practice and common pitfalls で説明されているように、他の問題を引き起こす可能性があります。
DateTime には、コードにバグを与えるように設計された無数のトラップがあります。
1.- DateTimeKind.Unspecified の DateTime 値は悪いニュースです。
2.- DateTime は、比較を行うときに UTC/Local を気にしません。
3.- DateTime 値は、標準のフォーマット文字列を認識しません。
4.- DateTime で UTC マーカーを持つ文字列を解析しても、UTC 時間が保証されません。
私はただ使用しますXmlConvert
:
XmlConvert.ToString(DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind);
タイムゾーンが自動的に保持されます。
これらの回答のほとんどには、明らかに ISO 8601 でサポートされていないミリ秒/マイクロ秒が含まれています。正しい回答は次のようになります。
System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssK");
// or
System.DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
参考文献:
標準の書式指定子は、 DateTimeFormatInfo.SortableDateTimePatternプロパティ
"s"
によって定義されるカスタムの日付と時刻の書式文字列を表します。パターンは定義された標準 ( ISO 8601 ) を反映しており、プロパティは読み取り専用です。したがって、使用されるカルチャや提供される形式プロバイダーに関係なく、常に同じです。カスタム書式文字列は."yyyy'-'MM'-'dd'T'HH':'mm':'ss"
この標準の書式指定子を使用すると、書式設定または解析操作で常にインバリアント カルチャが使用されます。
– MSDNから
DateTime.UtcNow をyyyy-MM-ddTHH:mm:ssZの文字列表現に変換するには、DateTime 構造体の ToString() メソッドをカスタム書式設定文字列と共に使用できます。DateTime でカスタム フォーマット文字列を使用する場合は、単一引用符を使用して区切り記号をエスケープする必要があることに注意してください。
以下は、必要な文字列表現を返します。
DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTimeFormatInfo.InvariantInfo)
SharePoint 2010以降で開発している場合は、
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
...
string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)