2009-11-30 69 views
48

我有一个我想格式化为“2009-09-01T00:00:00.000Z”的DateTime,但下面的代码给了我“2009-09-01T00:00:00.000 + 01:00”(两行) :如何将DateTime格式化为网络UTC格式?

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

任何想法如何使它工作?

回答

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

@Downvoter:你能告诉我们你的想法是错的这个答案? – LukeH

+10

这个工作,但.ToUniversalTime()会搞乱现有的日期,如果它已经在UTC但yourDateTime变量不指定。我最终删除了.ToUniversalTime(),然后将两端的日期(数据库和Web客户端)排在一起。 –

-2

试试这个:

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

Previously asked question

+3

我不是试图解析它(还),我我试图打印出来。 – Grzenio

3

你想用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'"); 
6

使用为“yyyy的最佳格式 ' - ' MM ' - ' dd'T'HH ':' 毫米 ':' SS'。'fffK”。

如果日期是UTC或带时区(+ -hh:mm)如果是本地的,则字符串上的最后一个K将更改为'Z'。 (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"); 
42

为什么不只是使用The Round-trip ("O", "o") Format Specifier

的“O”或“o”标准格式说明使用保留的时区的信息,并且发射与ISO 8601的规定对于DateTime值的结果字符串模式代表一个自定义的日期和时间格式的字符串,这种格式说明符旨在保留日期和时间值以及文本中的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“自定义格式字符串)利用的三种方式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 
+0

在像'HTTP-EQUIV meta标签= “最后一次修改”'格式是*** 2013年10月23日@ 17:23:00 UTC ***,这可能吗? –

3

有人指出,“ToUniversalTime”有点不安全的,因为它会导致意外的不正确的时间dispalys 。展开说明,我提供了一个更详细的解决方案示例,这里的示例创建了DateTime对象的扩展,它可以安全地返回UTC DateTime,您可以根据需要使用ToString ...。

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(); 
    } 
} 
1
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow) 

返回2017-02-10T08:12:39.483Z

0

此代码为我工作:

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