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

Grz*_*nio 79 .net c# 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")
Run Code Online (Sandbox Code Playgroud)

任何想法如何使其工作?

Luk*_*keH 140

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

  • 这工作但是.ToUniversalTime()会弄乱您现有的日期,如果它已经是UTC但是yourDateTime变量没有指定它.我最终删除了.ToUniversalTime()和日期,然后排列了两端的预期(数据库和Web客户端). (11认同)
  • 如果您的日期时间已经是世界通用时间,则可以随意调用`.ToUniversalTime()`,它不会更改它。-但是,如果您已经将通用时间值存储为本地时间,则当然它将对其进行更改(但是在这种情况下,您将面临更大的问题!)-无论如何,这个答案是可怕。您应该使用下面的答案指定的“ O”格式字符串。 (9认同)
  • @Downvoter:您想告诉我们您认为这个答案有什么问题吗? (2认同)
  • @BrainSlugs83:这个“可怕的”答案实际上给了OP他们所要求的:`2009-09-01T00:00:00.000Z`。使用“O”说明符会给它们不同的东西:`2009-09-01T00:00:00.0000000Z`。 (2认同)
  • 请注意,它不需要“'”字符,“yyyy-MM-ddTHH:mm:ss.fffZ”也可以工作并且更好。 (2认同)

Dmi*_*lov 66

为什么不使用往返("O","o")格式说明符

"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
Run Code Online (Sandbox Code Playgroud)

  • 对于那些尝试进行字符串转换的人:`$"{DateTime.UtcNow:O}"` (2认同)

arv*_*man 8

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

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

  • 您需要使用“fff”而不是“FFF”,否则 000 将不会准确地显示在标记上。 (6认同)

Car*_*ler 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");
Run Code Online (Sandbox Code Playgroud)


小智 6

有些人指出,"ToUniversalTime"有点不安全,因为它可能导致意外的错误时间显示.扩展我正在提供更详细的解决方案示例.此处的示例为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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Erg*_*lik 6

这段代码对我有用:

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);
Run Code Online (Sandbox Code Playgroud)


Nic*_*rdi 5

您想使用DateTimeOffset类。

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

对不起,我错过了你的原始格式与毫秒

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