如何将DateTime格式化为Web UTC格式?

时间:2009-11-30 16:40:14

标签: c# .net datetime utc

我有一个DateTime,我想格式化为“2009-09-01T00:00:00.000Z”,但是下面的代码给了我“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")

任何想法如何使其发挥作用?

8 个答案:

答案 0 :(得分:131)

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

答案 1 :(得分:63)

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

  

" O"或" o"标准格式说明符表示使用保留时区信息的模式的自定义日期和时间格式字符串,并发出符合ISO 8601的结果字符串。对于DateTime值,此格式说明符旨在保留日期和时间值以及DateTime。文本中的善良财产。如果styles参数设置为DateTimeStyles.RoundtripKind,则可以使用DateTime.Parse(String,IFormatProvider,DateTimeStyles)或DateTime.ParseExact方法解析格式化的字符串。

     

" O"或" o"标准格式说明符对应于" yyyy' MM' - ''' HH' mm' mm': ' SS'' fffffffK" DateTime值的自定义格式字符串以及" yyyy' MM' - ' d' H'' mm' mm' mm 39;:' 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

答案 2 :(得分:7)

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

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

答案 3 :(得分:6)

最好使用的格式是“yyyy” - “MM” - “dd'T'HH”:“mm”:“ss”。“fffK”。

如果日期为UTC,则字符串上的最后一个K将更改为“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");

答案 4 :(得分:5)

有些人指出,'ToUniversalTime'有点不安全,因为它可能导致意外的错误时间显示。扩展我正在提供更详细的解决方案示例。此处的示例为DateTime对象创建了一个扩展,可以安全地返回UTC DateTime,您可以根据需要使用ToString ....

[uwsgi]
uid = 1000
gid = 100
master=false
project=myproject
home=/home/someuser/var/virtualenv/myproject
virtualenv=/home/someuser/var/virtualenv/myproject
module=myproject.project.wsgi:application
wsgi-file=/home/someuser/var/virtualenv/myproject/lib/python2.7/site-packages/org/contrib/myproject/project/wsgi.py
pidfile=/home/someuser/var/virtualenv/myproject/tmp/uwsgi.pid
vacuum=True
max-requests=500
daemonize=/home/someuser/var/virtualenv/myproject/tmp/uwsgi.log
env=DJANGO_SETTINGS_MODULE=myproject.project.settings
http=127.0.0.1:2501

答案 5 :(得分:4)

您想使用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 :(得分:3)

此代码对我有用:

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

答案 7 :(得分:-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