DateTimeオブジェクトがある場合、ISO 8601の日付を文字列形式で取得するにはどうすればよいですか?


790

与えられた:

DateTime.UtcNow

ISO 8601準拠の形式で同じ値を表す文字列を取得するにはどうすればよいですか?

ISO 8601は多くの類似したフォーマットを定義していることに注意してください。私が探している特定の形式は次のとおりです。

yyyy-MM-ddTHH:mm:ssZ

回答:


780

読者への注記:いくつかのコメント者は、この回答のいくつかの問題を指摘しています(特に最初の提案に関連しています)。詳細については、コメントセクションを参照してください。

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")

日時書式オプション


20
最近、それを行うと(オフセットを指定してUTC時間をレンダリングしようとしても、あまり意味がありません)、例外がスローされます。したがって、不変のカルチャーを使用した "s"形式の方がおそらく正しいと他の人は同意します。例外として、formatexceptionのメッセージは次のとおりです。「UTC DateTimeは現地時間にのみ正しい形式のテキストに変換されます。これは、ローカルタイムゾーンオフセットを含む「z」形式指定子を使用してDateTime.ToStringを呼び出すと発生する可能性があります。出力で。」
Tom Lianza、2010年

9
私はオーストラリアに住んでいてToString("yyyy-MM-ddTHH:mm:ssK")、これを機能させるために使用する必要がありました(使用していたjquery timeagoプラグインを使用)。
GONeale 2011

6
タイムゾーンオフセットを含める場合は、次のようにしますdt.ToString("s") + dt.ToString("zzz")。// 2013-12-05T07:19:04-08:00
alekop

4
スラッシュ(\ :)は文字列に問題を引き起こします...代わりに@文字を入力して文字列リテラルを使用します。
ジジ14

6
@core:これは、リンクされたカスタム形式とは異なる標準形式の1つです:msdn.microsoft.com/en-us/library/az4se3k1(
Wayne

361

DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)「s」フォーマット指定子はソート可能な日付/時刻パターンとして記述されているため、探しているものが表示されます。ISO 8601に準拠しています。


34
これが正解だと思います。MicrosoftがすでにISO 8601を実装している場合は、yyyy-MM-etcを明示的に定義しても意味がありません。Iainの応答も正しいですが、複数の理由で常にInvariantCulture(またはその他のCultureInfo)を指定する必要があります(つまり、.NETが仮定するだけです)。また、使用することができます。 DateTime.UtcNow.ToString(CultureInfo.InvariantCulture.DateTimeFormat.SortableDateTimePattern); これらのすべては、時間帯などを除外するので、あなたは選択の余地があるかもしれないが、明示的なフォーマッタを使用するように、すなわち"yyyy-MM-ddTHH:mm:ss.fffZ"
ジョン・デイビス

20
準拠している間、タイムゾーンは省略され、次のZようになります。DateTime.UtcNow.ToString(c, CultureInfo.InvariantCulture)) => 2012-06-26T11:55:36コンピュータは1秒あたりかなりの数のティックを実行するため、非常に優れたミリ秒単位の解像度はありません。
Henrik

9
ではo、あなたが得る2012-06-26T11:55:36.1007668Z意味36.1007668秒を、あなたはまで解像度を得る1/10^7第二の。ISO8601:2004からIf a decimal fraction is included, lower order time elements (if any) shall be omitted and the decimal fraction shall be divided from the integer part by the decimal sign [...] the comma (,) or full stop (.)
Henrik

24
@ stimpy77 CultureInfoをに指定し"s"ても意味がないのは、「 "O"(または "o")、 "R"(または "r")、 "s"、および "u"
binki 2013

2
@binki-今、私はとても混乱しています。以前にSortableDateTimePatternにリンクしたドキュメントによると、それはカルチャ固有である必要があると述べています。しかし、それは独自の例と矛盾しているようです(それらはすべて同じように見えるため)。試してみてくださいDateTime.Now.ToString("s", new CultureInfo(myCulture))
drzaus 14

87
DateTime.UtcNow.ToString("s")

2008-04-10T06:30:00のようなものを返します

UtcNow明らかにUTC時間を返すので、害はありません。

string.Concat(DateTime.UtcNow.ToString("s"), "Z")

11
ちょうど興味がある:なぜ '+'ではなくstring.Concat()なのか?
ダニエルフォルトゥノフ2008

2
ウサギ、違いはありますか?
Iain

84
@KoenZomers:私はそれが正しいとは思いません。(aとbはもちろん文字列であると仮定して)とa + b同じ中間コードにコンパイルされるstring.Concat(a, b)ので、パフォーマンスやメモリ消費量に違いはないと思います。
Mark Byers、2012年

78
はい、マークは正しいです。公園、あなたは正しいとしても、ばかばかしく時期尚早なマイクロ最適化の罠に陥ったところです。
ノルドリン

7
@ greg84:まあ、あなたは完全に正しいわけではありません。マイクロソフトの建築家プエルトリコマリアーニすることで、この記事を見てみましょう。blogs.msdn.com/b/ricom/archive/2003/12/15/43628.aspx -彼は+ bは連結+にコンパイルを行うと言うの適切な使用についてのいくつかのより多くの情報がありますStringBuilder。
mrówa

37

使用する:

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

出典:


2
あなたは地元の慣習でコピーの犠牲者であるようです;-) string strLocalTimeAndOffset_custom = localTimeAndOffset.ToString("yyyy-MM-ddTHH:mm:ssK");結果は次のようになります:strLocalTimeAndOffset_custom: 2012-09-17T22:02:51-07:00
Holly

oISO-8601形式です。
Yousha Aleayoub

33
System.DateTime.UtcNow.ToString("o")

=>

val it : string = "2013-10-13T13:03:50.2950037Z"

これが、どのタイムゾーンでも明確な日付/時刻があることを確実に確認する唯一の方法であることに同意しました
Matt Wilko

23

次のコードで「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")

:Visual Studio 2008の「監視ユーティリティ」をtoString( "o")パーツに適用すると、異なる結果が得られる場合がありますが、それがバグかどうかはわかりませんが、この場合は、String変数を使用した方が良い結果が得られますデバッグしている場合。

ソース:標準の日付と時刻の形式文字列(MSDN)


20

ISO 8601に対してDateTimeを使用する必要がある場合、ToString( "o")は探しているものを生成するはずです。例えば、

2015-07-06T12:08:27

ただし、.NETのブログ投稿のDateTimeおよびDateTimeOffsetで説明されているように、DateTime + TimeZoneには他の問題が発生する可能性があります

DateTimeには、コードのバグを発生させるために設計された無数のトラップがあります。

1.- DateTimeKind.UnspecifiedのDateTime値は悪いニュースです。

2.-比較を行う場合、DateTimeはUTC /ローカルを気にしません。

3.- DateTime値は、標準のフォーマット文字列を認識しません。

4.- DateTimeでUTCマーカーを持つ文字列を解析しても、UTC時間は保証されません。


2
ISO8601は、1つの層で使用されます。しかししてください使用:StartTime.ToStringむしろ等のミリ秒を追加しますToStringメソッド( "O")よりも( "YYYY-MM-DDTHH:ミリメートルSSZ")
peterincumbria

2
私にとって、 "yyyy-MM-dd-THH:mm:ssZ"は文字列の末尾にタイムゾーンマーカーではなく文字どおり "Z"を出力しましたが、これは私が望んでいたことをしませんでした。ToString( "o")は実際、私が必要としていることをはるかに簡単かつ短時間で行いました。
ブレアコノリー2017年

18

誰もそれを提案していないことに驚いた:

System.DateTime.UtcNow.ToString("u").Replace(' ','T')
# Using PowerShell Core to demo

# Lowercase "u" format
[System.DateTime]::UtcNow.ToString("u")
> 2020-02-06 01:00:32Z

# Lowercase "u" format with replacement
[System.DateTime]::UtcNow.ToString("u").Replace(' ','T')
> 2020-02-06T01:00:32Z

UniversalSortableDateTimePatternは(もっとあるあなたが望むものをあなたに、ほぼすべての方法を取得し、RFC 3339の表現)。


追加:回答https://stackoverflow.com/a/43793679/653058にあるベンチマークを使用して、これがどのように機能するかを比較することにしました。

tl:dr; それは高価な終わりにありますが、私の安っぽい古いラップトップではまだ0.5ミリ秒ちょっとです:-)

実装:

[Benchmark]
public string ReplaceU()
{
   var text = dateTime.ToUniversalTime().ToString("u").Replace(' ', 'T');
   return text;
}

結果:

// * Summary *

BenchmarkDotNet=v0.11.5, OS=Windows 10.0.19002
Intel Xeon CPU E3-1245 v3 3.40GHz, 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100
  [Host]     : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT
  DefaultJob : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), 64bit RyuJIT


|               Method |     Mean |     Error |    StdDev |
|--------------------- |---------:|----------:|----------:|
|           CustomDev1 | 562.4 ns | 11.135 ns | 10.936 ns |
|           CustomDev2 | 525.3 ns |  3.322 ns |  3.107 ns |
|     CustomDev2WithMS | 609.9 ns |  9.427 ns |  8.356 ns |
|              FormatO | 356.6 ns |  6.008 ns |  5.620 ns |
|              FormatS | 589.3 ns |  7.012 ns |  6.216 ns |
|       FormatS_Verify | 599.8 ns | 12.054 ns | 11.275 ns |
|        CustomFormatK | 549.3 ns |  4.911 ns |  4.594 ns |
| CustomFormatK_Verify | 539.9 ns |  2.917 ns |  2.436 ns |
|             ReplaceU | 615.5 ns | 12.313 ns | 11.517 ns |

// * Hints *
Outliers
  BenchmarkDateTimeFormat.CustomDev2WithMS: Default     -> 1 outlier  was  removed (668.16 ns)
  BenchmarkDateTimeFormat.FormatS: Default              -> 1 outlier  was  removed (621.28 ns)
  BenchmarkDateTimeFormat.CustomFormatK: Default        -> 1 outlier  was  detected (542.55 ns)
  BenchmarkDateTimeFormat.CustomFormatK_Verify: Default -> 2 outliers were removed (557.07 ns, 560.95 ns)

// * Legends *
  Mean   : Arithmetic mean of all measurements
  Error  : Half of 99.9% confidence interval
  StdDev : Standard deviation of all measurements
  1 ns   : 1 Nanosecond (0.000000001 sec)

// ***** BenchmarkRunner: End *****

1
「o」の受け入れられた答えは機能しますが、煩わしい精度(geez .XXXXXXX秒)を与えますが、秒単位で停止するので、これを好みます。
ジョッキング

また、そのドキュメントは「u」がISO 8601であると主張していますが、Tではなくスペースとは何ですか?まとめるMicrosoft
jhocking

@jhocking en.wikipedia.org/wiki/ISO_8601#cite_note-30 ISO 8601は、読み通すと比較的寛容です...
rburte

16

私はただ使うでしょうXmlConvert

XmlConvert.ToString(DateTime.UtcNow, XmlDateTimeSerializationMode.RoundtripKind);

自動的にタイムゾーンが保持されます。


私は先に進んで、拡張メソッドを追加しました。public static class DateTimeExtensions {public static string ToIsoFormat(this DateTime dateTime){return XmlConvert.ToString(dateTime、XmlDateTimeSerializationMode.RoundtripKind); }}
2012年

14

これらの回答のほとんどには、ミリ秒/マイクロ秒があり、これは明らかにISO 8601でサポートされていません。正しい答えは次のとおりです。

System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssK");
// or
System.DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");

参照:


15
「Times」の下にある独自のWikipediaリンクを読んでください。「小数点以下の小数」について言及しています。つまり、ISO 8601はミリ秒とマイクロ秒の両方をサポートしています(ただし、通信する当事者は、受け入れられる小数点以下の桁数を制限する場合があります)。
セーレンBoisen

11
DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss zzz");

DateTime.Now.ToString("O");

注:最後に行う変換に応じて、最初の行(ほとんど同じ)または2番目の行を使用します。

「zzz」はUTC変換のタイムゾーン情報であるため、必ずローカル時間にフォーマットを適用してください。

画像


#ChrisHynesがコードの最初の行に関して私が行った提案について尋ねているので、私はそれほど確信がありませんが、もしあなたが正しい場合、その答えは「ReSharper」です
PSM

9

"s"標準フォーマット指定子はによって定義されたカスタムの日付と時刻のフォーマット文字列を表しDateTimeFormatInfo.SortableDateTimePatternプロパティを。パターンは定義された標準(ISO 8601)を反映し、プロパティは読み取り専用です。したがって、使用されるカルチャや提供されるフォーマットプロバイダーに関係なく、常に同じです。カスタム形式の文字列は"yyyy'-'MM'-'dd'T'HH':'mm':'ss"です。

この標準フォーマット指定子を使用すると、フォーマットまたは解析操作では常に不変カルチャが使用されます。

MSDNから


1
使用しても大丈夫.ToString("s")ですか?
AhmetB-Google

私はそう信じています。-要件が元の質問と一致する限り..しかし、以下のサイモンウィルソンによる警告をご覧ください
アマル

9

DateTime.UtcNowをyyyy-MM-ddTHH:mm:ssZの文字列表現に変換するには、カスタム書式設定文字列でDateTime構造のToString()メソッドを使用できます。DateTimeでカスタム形式の文字列を使用する場合、一重引用符を使用してセパレータをエスケープする必要があることを覚えておくことが重要です。

次のコードは、必要な文字列表現を返します。

DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'", DateTimeFormatInfo.InvariantInfo)

9

カスタムフォーマット "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;
        }
    }

https://github.com/dotnet/BenchmarkDotNetが使用されました



2

SharePoint 2010以降で開発している場合は、

using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
...
string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)

20
SharePoint、.Netが十分なJavaでない場合。
Henrik、

18
これにSharePointを使用することは、ゼリーの桶、マッチのウェットボックス、および2つの空中ブランコで歩くチンパンジーを銃撃戦に持ち込むようなものです。
nathanchere 2015年

SharePointでさえ、BCL .ToString("o")またはそれ以上のを使用できることを願っています$"My complicated string {dt:o}"
binki 2018

2

APIのURIで渡すことができる2018-06-22T13:04:16のような形式にするには、以下を使用します。

public static string FormatDateTime(DateTime dateTime)
{
    return dateTime.ToString("s", System.Globalization.CultureInfo.InvariantCulture);
}

1
このISOの日付文字列は、定義ごとに文化に依存しないと思います。
ジョナス

1

他の回答で述べたようにDateTime、設計上の問題があります。

野田時間

NodaTimeを使用して日付/時刻の値を管理することをお勧めします。

  • 現地時間、日付、日時
  • グローバルタイム
  • タイムゾーン付きの時間
  • 限目
  • 期間

フォーマット

したがって、作成してフォーマットZonedDateTimeするには、次のコードスニペットを使用できます。

var instant1 = Instant.FromUtc(2020, 06, 29, 10, 15, 22);

var utcZonedDateTime = new ZonedDateTime(instant1, DateTimeZone.Utc);
utcZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T10:15:22Z


var instant2 = Instant.FromDateTimeUtc(new DateTime(2020, 06, 29, 10, 15, 22, DateTimeKind.Utc));

var amsterdamZonedDateTime = new ZonedDateTime(instant2, DateTimeZoneProviders.Tzdb["Europe/Amsterdam"]);
amsterdamZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T12:15:22Z

私にとってNodaTimeコードはかなり冗長に見えます。しかし、型は本当に便利です。それらは日付/時刻値を正しく処理するのに役立ちます。

Newtonsoft.Json

で使用するにNodaTimeNewtonsoft.JsonNodaTime.Serialization.JsonNetNuGetパッケージへの参照を追加し、JSONオプションを構成する必要があります。

services
    .AddMvc()
    .AddJsonOptions(options =>
    {
        var settings=options.SerializerSettings;
        settings.DateParseHandling = DateParseHandling.None;
        settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
    });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.