代码之家  ›  专栏  ›  技术社区  ›  Grzenio

如何将日期时间格式设置为Web UTC格式?

  •  68
  • Grzenio  · 技术社区  · 15 年前

    我有一个日期时间,我想将其格式化为“ 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 回复  |  直到 7 年前
        1
  •  126
  •   LukeH    15 年前
    string foo = yourDateTime.ToUniversalTime()
                             .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
    
        2
  •  55
  •   Dominic Zukiewicz    11 年前

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

    “o”或“o”标准格式说明符表示自定义日期和时间格式字符串,使用的模式保留时区信息并发出符合ISO 8601的结果字符串。对于日期时间值,此格式说明符设计用于在文本中保留日期和时间值以及date time.kind属性。如果Styles参数设置为DateTimeStyles.RoundTripKind,则可以使用DateTime.Parse(String、IFormatProvider、DateTimeStyles)或DateTime.ParseExact方法分析格式化字符串。

    “o”或“o”标准格式说明符对应于日期时间值的“yyyy”-“mm”-“dd't'hh”:“mm”:“ss”。“fffffffff k”自定义格式字符串和日期时间偏移值的“yyyy”-“mm”-“dd't'hh”:“mm”:“ss”。“fffffff zzz”自定义格式字符串。在此字符串中,分隔单个字符(如连字符、冒号和字母“T”)的单引号对表示单个字符是不能更改的文字。撇号不出现在输出字符串中。

    O或O标准格式说明符(以及“YYYY”-“MM”-“DD”T“HH”:“MM”:“SS”。“fffffff k”自定义格式字符串)利用ISO 8601表示时区信息的三种方式来保留日期时间值的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
    
        3
  •  6
  •   Carlos Beppler    12 年前

    要使用的最佳格式是“yyyy”-“mm”-“dd”t“hh”:“mm”:“ss”。“fffk”。

    如果日期是UTC,则最后一个k on字符串将更改为“z”;如果是本地的,则最后一个k on字符串将更改为时区(+-hh:mm)。( http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx )

    正如鲁克所说,如果你想所有的日期都是UTC,最好使用Touniversaltime。

    最终代码是:

    string foo = yourDateTime.ToUniversalTime()
                             .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");
    
        4
  •  5
  •   user3228938    8 年前

    一些人指出,touniversaltime_是有点不安全的,因为它可能导致意外的错误时间显示。在i_m的基础上进行扩展,提供了更详细的解决方案示例。这里的示例创建了对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();
        }
    }
    
        5
  •  4
  •   Nick Berardi    15 年前

    你想用 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
  •  4
  •   arviman    8 年前
    string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)
    

    返回2017-02-10t08:12:39.483z

        7
  •  3
  •   Stepan Novikov    8 年前

    此代码对我有效:

    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);
    
        8
  •  -2
  •   Community CDub    8 年前

    试试这个:

    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

    推荐文章