DateTimeをWebUTC形式にフォーマットするにはどうすればよいですか?


89

" 2009-09-01T00:00:00.000Z"にフォーマットしたいDateTimeがありますが、次のコードで " 2009-09-01T00:00:00.000+01:00"(両方の行)が表示されます。

new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")

それを機能させる方法はありますか?

回答:


160
string foo = yourDateTime.ToUniversalTime()
                         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");

1
@Downvoter:この回答のどこが間違っていると思いますか?
LukeH 2014年

12
これは機能しましたが、.ToUniversalTime()は、既存の日付がすでにUTCにあるが、yourDateTime変数で指定されていない場合、既存の日付を台無しにします。最終的に.ToUniversalTime()を削除すると、日付が両端(データベースとWebクライアント)で期待されていたものと一致しました。
ロビンベッシー2015

10
あなたの日時がすでに普遍的な時間であるならば、あなたは.ToUniversalTime()あなたが望むすべてを呼ぶことができます、それはそれを変えません。-ただし、世界時の値が現地時間として保存されている場合は、もちろんそれが変更されます(ただし、その場合は、対処すべき大きな問題があります!)-とにかく、この答えは次のとおりです。ひどい。"O"代わりに、以下の回答で指定されているフォーマット文字列を使用する必要があります。
BrainSlugs83 2018年

1
@ BrainSlugs83:この「ひどい」答えは、実際にOPに彼らが求めたものを与えます:2009-09-01T00:00:00.000Z。「O」指定子を使用すると、別の何かが得られます2009-09-01T00:00:00.0000000Z
LukeH

日時の書式カスタム文字列のドキュメントdocs.microsoft.com/en-us/dotnet/standard/base-types/...
マーク・エベール

75

ラウンドトリップ( "O"、 "o")フォーマット指定子を使用しないのはなぜですか?

「O」または「o」標準フォーマット指定子は、タイムゾーン情報を保持し、ISO 8601に準拠した結果文字列を出力するパターンを使用して、カスタムの日付と時刻のフォーマット文字列を表します。DateTime値の場合、このフォーマット指定子は日付を保持するように設計されています。および時間値とテキストのDateTime.Kindプロパティ。スタイルパラメータがDateTimeStyles.RoundtripKindに設定されている場合は、DateTime.Parse(String、IFormatProvider、DateTimeStyles)またはDateTime.ParseExactメソッドを使用して、フォーマットされた文字列を解析して戻すことができます。

「O」または「o」標準フォーマット指定子は、DateTime値の「yyyy」-「MM」-「dd」T「HH」:「mm」:「ss」。「fffffffK」カスタムフォーマット文字列に対応します。 "yyyy'- 'MM'-' dd'T'HH ':' mm ':' ss '。' ffffffffzzz" DateTimeOffset値のカスタムフォーマット文字列。この文字列では、ハイフン、コロン、文字「T」などの個々の文字を区切る一重引用符のペアは、個々の文字が変更できないリテラルであることを示しています。アポストロフィは出力文字列に表示されません。

O "または" o "標準フォーマット指定子(および" yyyy'- 'MM'-' dd'T'HH ':' mm ':' ss '。' fffffffK "カスタムフォーマット文字列)は、3つの方法を利用します。 ISO 8601は、DateTime値のKindプロパティを保持するためのタイムゾーン情報を表します。

public class Example
{
   public static void Main()
   {
       DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30, 
                                   DateTimeKind.Unspecified);
       Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind); 

       DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30, 
                                    DateTimeKind.Utc);
       Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind);

       DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30, 
                                    DateTimeKind.Local);
       Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind);

       DateTimeOffset dto = new DateTimeOffset(lDat);
       Console.WriteLine("{0} --> {0:O}", dto);
   }
}
// The example displays the following output: 
//    6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000 
//    6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z 
//    6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00 
//     
//    6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00

要求どおりに機能しないため、結局引用しました"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz" が、Zulu形式ではありません。
astrowalker

@astrowalker動作するはずです。彼はあなたに彼の答えで複数の選択肢を与えました。1つだけ選ぶ必要があります。あなたの場合(そしてOPの場合)、DateTimeKind.Utcを使用して、末尾に「z」が付いた文字列(別名「ZuluFormat」または「UTCTime」)を生成します。UTCの出力例を見てください。私の場合、:を使用しました。 dtVariable.ToUniversalTime().ToString("o")これは"2019-05-26T19:50:34.4400000Z"またはに変換され"yyyy-MM-ddTHH:mm:ss.fffffffZ"ます。注:これもJavscriptのnew Date(dtDateString).getTime()メソッドでテストしており、これによって生成された日付文字列を正しく解析します。
MikeTeeVee

@MikeTeeVee、提供されたソリューションが機能しないことを指摘していました(DTOの場合)。適切な方法はdto.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF'Z'")です。記録のために、"o"オフセットを追加するだけで、Zulu形式ではありません。
astrowalker

1
:文字列変換をやろうとして人のために$"{DateTime.UtcNow:O}"
ティアゴセザール・オリベイラ

18
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)

2017-02-10T08:12:39.483Zを返します


6

使用するのに最適な形式は、「yyyy」-「MM」-「dd」「HH」:「mm」:「ss」。「fffK」です。

文字列の最後のKは、日付がUTCの場合は「Z」に変更され、ローカルの場合はタイムゾーン(+ -hh:mm)に変更されます。(http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

LukeHが言ったように、すべての日付をUTCにしたい場合は、ToUniversalTimeを使用することをお勧めします。

最終的なコードは次のとおりです。

string foo = yourDateTime.ToUniversalTime()
                         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");

6

一部の人々は、「ToUniversalTime」は、意図しない誤った時間の表示を引き起こす可能性があるという点で、やや安全ではないと指摘しています。それを拡張して、ソリューションのより詳細な例を提供します。ここのサンプルは、必要に応じてToStringを使用できるUTCDateTimeを安全に返すDateTimeオブジェクトの拡張機能を作成します。

class Program
{
    static void Main(string[] args)
    {
        DateTime dUtc = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Utc);
        DateTime dUnspecified = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Unspecified);

        //Sample of an unintended mangle:
        //Prints "2016-06-01 10:17:00Z"
        Console.WriteLine(dUnspecified.ToUniversalTime().ToString("u"));

        //Prints "2016 - 06 - 01 03:17:00Z"
        Console.WriteLine(dUtc.SafeUniversal().ToString("u"));

        //Prints "2016 - 06 - 01 03:17:00Z"
        Console.WriteLine(dUnspecified.SafeUniversal().ToString("u"));
    }
}

public static class ConvertExtensions
{
    public static DateTime SafeUniversal(this DateTime inTime)
    {
        return (DateTimeKind.Unspecified == inTime.Kind)
            ? new DateTime(inTime.Ticks, DateTimeKind.Utc)
            : inTime.ToUniversalTime();
    }
}

5

DateTimeOffsetクラスを使用します。

var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L));
var stringDate = date.ToString("u");

申し訳ありませんが、ミリ秒で元のフォーマットを見逃しました

var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");

5

このコードは私のために働いています:

var datetime = new DateTime(2017, 10, 27, 14, 45, 53, 175, DateTimeKind.Local);
var text = datetime.ToString("o");
Console.WriteLine(text);
--  2017-10-27T14:45:53.1750000+03:00

// datetime from string
var newDate = DateTime.ParseExact(text, "o", null);

-3

これを試して:

DateTime date = DateTime.ParseExact(
    "Tue, 1 Jan 2008 00:00:00 UTC", 
    "ddd, d MMM yyyy HH:mm:ss UTC", 
    CultureInfo.InvariantCulture);

以前に尋ねられた質問


3
私はそれを(まだ)解析しようとはしていません、私はそれを印刷しようとしています。
Grzenio 2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.