web-dev-qa-db-ja.com

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

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

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

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

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

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

「O」または「o」の標準書式指定子は、「yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '。' fffffffK」のDateTime値および「yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '。' fffffffzzz」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
65
Dmitry Pavlov
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)

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

8
arviman

使用するのに最適な形式は「yyyy '-' MM '-' dd'T'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
Carlos Beppler

一部の人々は、「ToUniversalTime」は意図しない不正確な時刻表示を引き起こす可能性があるという点で、やや安全ではないと指摘しています。それを拡張して、ソリューションのより詳細な例を提供します。ここのサンプルは、希望どおりにToStringを使用できるUTC DateTimeを安全に返す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
user3228938

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'");
4
Nick Berardi

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

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
Ergin Çelik