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