与えられた:
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");
2008-09-22T14:01:54.9571247Z
指定された形式を取得するには、次のようにします。
DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")
"s"フォーマット指定子はソート可能な日付/時刻パターンとして記述されているので、DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)
はあなたが探しているものをあなたに与えるべきです。 ISO 8601に準拠しています。
DateTime.UtcNow.ToString("s")
2008-04-10T06:30:00のようなものを返します
UtcNow
は明らかに _ utc _ timeを返すので、以下に害はありません。
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"
次のコードで "Z"( ISO 8601 _ utc _ )を取得できます。
Dim tmpDate As DateTime = New DateTime(Now.Ticks, DateTimeKind.Utc)
Dim res as String = tmpDate.toString("o") '2009-06-15T13:45:30.0000000Z
これが理由です:
ISO 8601にはいくつかの異なるフォーマットがあります。
DateTimeKind.Local
2009-06-15T13:45:30.0000000-07:00
DateTimeKind.Utc
2009-06-15T13:45:30.0000000Z
DateTimeKind.Unspecified
2009-06-15T13:45:30.0000000
.NETはこれらのオプションを含む列挙型を提供しています。
'2009-06-15T13:45:30.0000000-07:00
Dim strTmp1 As String = New DateTime(Now.Ticks, DateTimeKind.Local).ToString("o")
'2009-06-15T13:45:30.0000000Z
Dim strTmp2 As String = New DateTime(Now.Ticks, DateTimeKind.Utc).ToString("o")
'2009-06-15T13:45:30.0000000
Dim strTmp3 As String = New DateTime(Now.Ticks, DateTimeKind.Unspecified).ToString("o")
注 :toString( "o")部分にVisual Studio 2008の "watchユーティリティ"を適用した場合、結果が異なる場合がありますが、それがバグかどうかはわかりませんしかしこの場合、デバッグしているならString変数を使った方が良い結果が得られます。
出典:標準の日付と時刻のフォーマット文字列(MSDN)
ISO 8601に準拠したDateTimeを使用する必要がある場合は、ToString( "o")で探しているものを取得できます。例えば、
2015-07-06T12:08:27
しかし、DateTime + TimeZoneはブログ記事.NETのDATETIMEとDATETIMEOFFSET:良い習慣とよくある落とし穴に記述されているように他の問題を提示するかもしれません:
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");
参考文献:
DateTime.UtcNowを yyyy-MM-ddTHH:mm:ssZ の文字列表現に変換するには、カスタム書式設定文字列でDateTime構造体のToString()メソッドを使用できます。 DateTimeでカスタムフォーマット文字列を使用する場合、一重引用符を使用して区切り記号をエスケープする必要があることを覚えておくことが重要です。
以下はあなたが欲しい文字列表現を返します。
DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTimeFormatInfo.InvariantInfo)
"s"
標準フォーマット指定子は、 DateTimeFormatInfo.SortableDateTimePattern プロパティによって定義されるカスタムの日付と時刻のフォーマット文字列を表します。パターンは定義された規格( ISO 8601 )を反映しており、プロパティは読み取り専用です。したがって、使用されるカルチャや提供されるフォーマットプロバイダに関係なく、常に同じです。カスタムフォーマット文字列は"yyyy'-'MM'-'dd'T'HH':'mm':'ss"
です。この標準フォーマット指定子を使用すると、フォーマット操作または構文解析操作は常に不変カルチャを使用します。
- from _ msdn _
DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss zzz");
DateTime.Now.ToString("O");
注:最後に行った変換に応じて、最初の行(最もよく似ている)または2行目を使用します。
"zzz"はUTC変換のタイムゾーン情報なので、必ず現地時間にフォーマットを適用してください。
興味深いのは、カスタムフォーマット "yyyy-MM-ddTHH:mm:ssK"(msなし)が最も速いフォーマット方法であることです。
また、 "S"フォーマットがクラシックでは遅く、コアでは速いというのも興味深いことです。
もちろん、数は非常に近いので、行によって違いはそれほど重要ではありません(_Verify
という接尾辞のあるテストは、その接尾辞のないテストと同じです。結果の再現性が実証されています)。
BenchmarkDotNet=v0.10.5, OS=Windows 10.0.14393
Processor=Intel Core i5-2500K CPU 3.30GHz (Sandy Bridge), ProcessorCount=4
Frequency=3233539 Hz, Resolution=309.2587 ns, Timer=TSC
[Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
Clr : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
Core : .NET Core 4.6.25009.03, 64bit RyuJIT
Method | Job | Runtime | Mean | Error | StdDev | Median | Min | Max | Rank | Gen 0 | Allocated |
--------------------- |----- |-------- |-----------:|----------:|----------:|-----------:|-----------:|-----------:|-----:|-------:|----------:|
CustomDev1 | Clr | Clr | 1,089.0 ns | 22.179 ns | 20.746 ns | 1,079.9 ns | 1,068.9 ns | 1,133.2 ns | 8 | 0.1086 | 424 B |
CustomDev2 | Clr | Clr | 1,032.3 ns | 19.897 ns | 21.289 ns | 1,024.7 ns | 1,000.3 ns | 1,072.0 ns | 7 | 0.1165 | 424 B |
CustomDev2WithMS | Clr | Clr | 1,168.2 ns | 16.543 ns | 15.474 ns | 1,168.5 ns | 1,149.3 ns | 1,189.2 ns | 10 | 0.1625 | 592 B |
FormatO | Clr | Clr | 1,563.7 ns | 31.244 ns | 54.721 ns | 1,532.5 ns | 1,497.8 ns | 1,703.5 ns | 14 | 0.2897 | 976 B |
FormatS | Clr | Clr | 1,243.5 ns | 24.615 ns | 31.130 ns | 1,229.3 ns | 1,200.6 ns | 1,324.2 ns | 13 | 0.2865 | 984 B |
FormatS_Verify | Clr | Clr | 1,217.6 ns | 11.486 ns | 10.744 ns | 1,216.2 ns | 1,205.5 ns | 1,244.3 ns | 12 | 0.2885 | 984 B |
CustomFormatK | Clr | Clr | 912.2 ns | 17.915 ns | 18.398 ns | 916.6 ns | 878.3 ns | 934.1 ns | 4 | 0.0629 | 240 B |
CustomFormatK_Verify | Clr | Clr | 894.0 ns | 3.877 ns | 3.626 ns | 893.8 ns | 885.1 ns | 900.0 ns | 3 | 0.0636 | 240 B |
CustomDev1 | Core | Core | 989.1 ns | 12.550 ns | 11.739 ns | 983.8 ns | 976.8 ns | 1,015.5 ns | 6 | 0.1101 | 423 B |
CustomDev2 | Core | Core | 964.3 ns | 18.826 ns | 23.809 ns | 954.1 ns | 935.5 ns | 1,015.6 ns | 5 | 0.1267 | 423 B |
CustomDev2WithMS | Core | Core | 1,136.0 ns | 21.914 ns | 27.714 ns | 1,138.1 ns | 1,099.9 ns | 1,200.2 ns | 9 | 0.1752 | 590 B |
FormatO | Core | Core | 1,201.5 ns | 16.262 ns | 15.211 ns | 1,202.3 ns | 1,178.2 ns | 1,225.5 ns | 11 | 0.0656 | 271 B |
FormatS | Core | Core | 993.5 ns | 19.272 ns | 24.372 ns | 999.4 ns | 954.2 ns | 1,029.5 ns | 6 | 0.0633 | 279 B |
FormatS_Verify | Core | Core | 1,003.1 ns | 17.577 ns | 16.442 ns | 1,009.2 ns | 976.1 ns | 1,024.3 ns | 6 | 0.0674 | 279 B |
CustomFormatK | Core | Core | 878.2 ns | 17.017 ns | 20.898 ns | 877.7 ns | 851.4 ns | 928.1 ns | 2 | 0.0555 | 215 B |
CustomFormatK_Verify | Core | Core | 863.6 ns | 3.968 ns | 3.712 ns | 863.0 ns | 858.6 ns | 870.8 ns | 1 | 0.0550 | 215 B |
コード:
public class BenchmarkDateTimeFormat
{
public static DateTime dateTime = DateTime.Now;
[Benchmark]
public string CustomDev1()
{
var d = dateTime.ToUniversalTime();
var sb = new StringBuilder(20);
sb.Append(d.Year).Append("-");
if (d.Month <= 9)
sb.Append("0");
sb.Append(d.Month).Append("-");
if (d.Day <= 9)
sb.Append("0");
sb.Append(d.Day).Append("T");
if (d.Hour <= 9)
sb.Append("0");
sb.Append(d.Hour).Append(":");
if (d.Minute <= 9)
sb.Append("0");
sb.Append(d.Minute).Append(":");
if (d.Second <= 9)
sb.Append("0");
sb.Append(d.Second).Append("Z");
var text = sb.ToString();
return text;
}
[Benchmark]
public string CustomDev2()
{
var u = dateTime.ToUniversalTime();
var sb = new StringBuilder(20);
var y = u.Year;
var d = u.Day;
var M = u.Month;
var h = u.Hour;
var m = u.Minute;
var s = u.Second;
sb.Append(y).Append("-");
if (M <= 9)
sb.Append("0");
sb.Append(M).Append("-");
if (d <= 9)
sb.Append("0");
sb.Append(d).Append("T");
if (h <= 9)
sb.Append("0");
sb.Append(h).Append(":");
if (m <= 9)
sb.Append("0");
sb.Append(m).Append(":");
if (s <= 9)
sb.Append("0");
sb.Append(s).Append("Z");
var text = sb.ToString();
return text;
}
[Benchmark]
public string CustomDev2WithMS()
{
var u = dateTime.ToUniversalTime();
var sb = new StringBuilder(23);
var y = u.Year;
var d = u.Day;
var M = u.Month;
var h = u.Hour;
var m = u.Minute;
var s = u.Second;
var ms = u.Millisecond;
sb.Append(y).Append("-");
if (M <= 9)
sb.Append("0");
sb.Append(M).Append("-");
if (d <= 9)
sb.Append("0");
sb.Append(d).Append("T");
if (h <= 9)
sb.Append("0");
sb.Append(h).Append(":");
if (m <= 9)
sb.Append("0");
sb.Append(m).Append(":");
if (s <= 9)
sb.Append("0");
sb.Append(s).Append(".");
sb.Append(ms).Append("Z");
var text = sb.ToString();
return text;
}
[Benchmark]
public string FormatO()
{
var text = dateTime.ToUniversalTime().ToString("o");
return text;
}
[Benchmark]
public string FormatS()
{
var text = string.Concat(dateTime.ToUniversalTime().ToString("s"),"Z");
return text;
}
[Benchmark]
public string FormatS_Verify()
{
var text = string.Concat(dateTime.ToUniversalTime().ToString("s"), "Z");
return text;
}
[Benchmark]
public string CustomFormatK()
{
var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
return text;
}
[Benchmark]
public string CustomFormatK_Verify()
{
var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
return text;
}
}
2018-06-22T13:04:16 のようにフォーマットするには、APIのURIで渡すことができます。
public static string FormatDateTime(DateTime dateTime)
{
return dateTime.ToString("s", System.Globalization.CultureInfo.InvariantCulture);
}
誰もそれを示唆していないことに驚いた:
System.DateTime.UtcNow.ToString("u").Replace(' ','T')
UniversalSortableDateTimePattern を使用すると、ほぼすべての方法を実現できます(これはより多くの RFC 3339 表現です)。
SharePoint 2010 以降で開発している場合は、次のものを使用できます。
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
...
string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)
Newtonsoft.Jsonを使って、あなたはすることができます
JsonConvert.SerializeObject(DateTime.UtcNow)