Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将DateTime格式化为web UTC格式?_C#_.net_Datetime_Utc - Fatal编程技术网

C# 如何将DateTime格式化为web UTC格式?

C# 如何将DateTime格式化为web UTC格式?,c#,.net,datetime,utc,C#,.net,Datetime,Utc,我有一个日期时间,我想将其格式化为“2009-09-01T00:00:00.000Z”,但下面的代码给了我“2009-09-01T00:00:00.000+01:00”(两行): 有什么办法让它工作吗?试试这个: DateTime date = DateTime.ParseExact( "Tue, 1 Jan 2008 00:00:00 UTC", "ddd, d MMM yyyy HH:mm:ss UTC", CultureInfo.InvariantCulture

我有一个日期时间,我想将其格式化为“
2009-09-01T00:00:00.000Z
”,但下面的代码给了我“
2009-09-01T00:00:00.000+01:00
”(两行):

有什么办法让它工作吗?

试试这个:

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

很抱歉,我用毫秒数遗漏了您的原始格式

var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
最好使用的格式是“yyyy'-'MM'-'dd'T'HH':'MM':'ss.'fffK”

如果日期为UTC,则字符串上的最后一个K将更改为“Z”,如果日期为本地,则带有时区(+-hh:mm)。()

正如LukeH所说,如果希望所有日期都是UTC,那么最好使用ToUniversalTime

最后的代码是:

string foo = yourDateTime.ToUniversalTime()
                         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");
你为什么不直接使用它呢

“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.”“fffffff k”自定义格式字符串(用于日期时间值)和“yyyy'-'MM'-'dd'T'HH':'MM':'ss.”“fffffff zzz”自定义格式字符串(用于日期时间偏移值)。在此字符串中,分隔单个字符的双引号(如连字符、冒号和字母“T”)表示单个字符是无法更改的文字。撇号不会出现在输出字符串中

“O”或“O”标准格式说明符(以及“yyyy'-'MM'-'dd'T'HH':'MM':'ss.”“fffffff k”自定义格式字符串)利用ISO 8601表示时区信息的三种方式来保留日期时间值的种类属性:

公共类示例
{
公共静态void Main()
{
DateTime dat=新的日期时间(2009,6,15,13,45,30,
DateTimeKind.未指定);
WriteLine(“{0}({1}-->{0:O}”,dat,dat.Kind);
DateTime uDat=新的日期时间(2009,6,15,13,45,30,,
DateTimeKind.Utc);
WriteLine(“{0}({1}-->{0:O}”,uDat,uDat.Kind);
DateTime lDat=新的日期时间(2009,6,15,13,45,30,
DateTimeKind.Local);
WriteLine(“{0}({1}-->{0:O}\n”,lDat,lDat.Kind);
DateTimeOffset dto=新的DateTimeOffset(lDat);
WriteLine(“{0}-->{0:O}”,dto);
}
}
//该示例显示以下输出:
//2009年6月15日下午1:45:30(未指定)-->2009-06-15T13:45:30.0000000
//2009年6月15日下午1:45:30(Utc)-->2009-06-15T13:45:30.0000000Z
//2009年6月15日下午1:45:30(本地)-->2009-06-15T13:45:30.0000000-07:00
//     
//2009年6月15日下午1:45:30-07:00-->2009-06-15T13:45:30.0000000-07:00

一些人指出,“ToUniversalTime”有点不安全,因为它可能会导致意外的不正确的时间分析。在此基础上,我提供了一个更详细的解决方案示例。这里的示例创建了DateTime对象的扩展,该对象安全地返回UTC DateTime,您可以根据需要使用ToStringd、

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

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

此代码适用于我:

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

我并没有试图解析它,我只是想把它打印出来。@ian-p,删除你的“答案”是否值得?它更多的是一个评论,甚至没有解决问题的意图——或者缺少一个解释。@Downvoter:你想告诉我们你认为这个答案有什么错吗?这是有效的,但.ToUniversalTime()是错误的如果您的现有日期已经是UTC,但yourDateTime变量没有指定它,则会将其弄乱。我最终删除了.ToUniversalTime(),然后将日期与两端(数据库和web客户端)的预期日期对齐。如果您的日期时间已经是世界时,则可以调用
.ToUniversalTime()
只要你想,它就不会改变它。--然而,如果你有一个存储为本地时间的通用时间值,那么它当然会改变它(但在这种情况下,你有更大的问题要处理!)--无论如何,这个答案很糟糕。你应该使用
“O“
改为按下面的答案设置字符串格式。@Brainslaugs83:这个“糟糕”的答案实际上给出了OP想要的:
2009-09-01T00:00:00.000Z
。使用“O”说明符会给他们带来一些不同的东西:
2009-09-01T00:00:00.0000000 z
。DateTime自定义字符串格式的文档因为它不能按要求工作,所以您引用了它--
“yyyyy'-'MM'-'dd'T'HH':'MM':'ss'。“fffffff zzz”
不是祖鲁格式。@astrowalker它应该可以工作。他在回答中给了你多种选择。你只需要挑一个。在您的情况下(以及在OP中),您将使用DateTimeKind.Utc生成结尾带有“z”的字符串(也称为“Zulu格式”或“Utc时间”)。只需看看他的UTC输出示例。在我的例子中,我使用了:
dtVariable.ToUniversalTime().ToString(“o”)
,它将转换为
“2019-05-26T19:50:34.4400000Z”
“yyyy-MM-ddTHH:MM:ss.fffffffZ”
。注意:我还使用Javscript的
新日期(dtDateString).getTime()
方法对此进行了测试,它正确地解析了由此产生的日期字符串。@Miketeeve,我只是指出提供的解决方案不起作用(对于DTO)。适当的方法是
dto.ToUniversalTime().ToString(“yyyy'-'MM'-'dd'T'HH':'MM':'ss.'FFFFFFF'Z')
。对于记录,只需添加偏移量,它不是Zulu格式。对于那些试图进行字符串转换的人:
$“{DateTime.UtcNow:o}”
您需要使用
fff
,而不是<
string foo = yourDateTime.ToUniversalTime()
                         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");
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();
    }
}
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)
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);