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")
それを機能させる方法はありますか?
解決
string foo = yourDateTime.ToUniversalTime()
.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
他のヒント
ラウンドトリップ(&quot ; O"、" o")Format Specifier ?
" O"または" o"標準書式指定子は、タイムゾーン情報を保持し、ISO 8601に準拠する結果文字列を出力するパターンを使用して、カスタムの日付および時刻書式文字列を表します。DateTime値の場合、この書式指定子は、DateTimeとともに日付および時刻値を保存するように設計されています。テキストの種類のプロパティ。 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"カスタム形式文字列)は、ISO 8601がタイムゾーンを表す3つの方法を利用します。 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
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)
2017-02-10T08:12:39.483Zを返します
使用する最適な形式は" yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '。' fffK"です。
文字列の最後のKは、日付がUTCの場合は 'Z'に、ローカルの場合はタイムゾーン(+ -hh:mm)で変更されます。 ( http://msdn.microsoft.com/en-us/library/8kb3ddd4。 aspx )
すべての日付をUTCにしたい場合は、LukeHが言ったように、ToUniversalTimeを使用することをお勧めします。
最終コードは次のとおりです。
string foo = yourDateTime.ToUniversalTime()
.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");
「ToUniversalTime」は、意図しない不正確な時刻表示を引き起こす可能性があるため、「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();
}
}
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'");
このコードは私のために働いています:
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);
これを試してください:
DateTime date = DateTime.ParseExact(
"Tue, 1 Jan 2008 00:00:00 UTC",
"ddd, d MMM yyyy HH:mm:ss UTC",
CultureInfo.InvariantCulture);