考虑到:
DateTime.UtcNow
我如何获得一个字符串,它表示在ISO 8601兼容的格式相同的值?
请注意,ISO 8601定义了许多类似的格式。我想要的具体格式是:
yyyy-MM-ddTHH:mm:ssZ
考虑到:
DateTime.UtcNow
我如何获得一个字符串,它表示在ISO 8601兼容的格式相同的值?
请注意,ISO 8601定义了许多类似的格式。我想要的具体格式是:
yyyy-MM-ddTHH:mm:ssZ
当前回答
如果你在SharePoint 2010或更高版本下开发,你可以使用
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
...
string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)
其他回答
您有一些选项,包括“往返(“O”)格式说明符”。
var date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString("O"));
Console.WriteLine(date1.ToString("s", System.Globalization.CultureInfo.InvariantCulture));
输出
2008-03-01T07:00:00.0000000
2008-03-01T07:00:00
然而,DateTime + TimeZone可能会出现其他问题,如博客文章DateTime和DateTimeOffset in .NET:良好实践和常见陷阱中所述:
DateTime有无数的陷阱,旨在给你的代码错误: 1.- DateTime值与DateTimeKind。不确定是坏消息。 2.- DateTime在比较时不关心UTC/Local。 3.- DateTime值不支持标准格式字符串。 4.—解析带DateTime的UTC标记的字符串不能保证UTC时间。
如果你在SharePoint 2010或更高版本下开发,你可以使用
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
...
string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)
正如在其他回答中提到的,DateTime在设计上存在问题。
野田时间
我建议使用NodaTime来管理日期/时间值:
本地时间,日期,datetime 全球时间 带时区的时间 期 持续时间
格式化
因此,要创建并格式化ZonedDateTime,您可以使用以下代码片段:
var instant1 = Instant.FromUtc(2020, 06, 29, 10, 15, 22);
var utcZonedDateTime = new ZonedDateTime(instant1, DateTimeZone.Utc);
utcZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T10:15:22Z
var instant2 = Instant.FromDateTimeUtc(new DateTime(2020, 06, 29, 10, 15, 22, DateTimeKind.Utc));
var amsterdamZonedDateTime = new ZonedDateTime(instant2, DateTimeZoneProviders.Tzdb["Europe/Amsterdam"]);
amsterdamZonedDateTime.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture);
// 2020-06-29T12:15:22Z
对我来说,NodaTime代码看起来相当冗长。但是类型真的很有用。它们有助于正确处理日期/时间值。
Newtonsoft。Json
使用Newtonsoft的NodaTime。您需要添加引用到NodaTime.Serialization.JsonNet NuGet包并配置Json选项。
services
.AddMvc()
.AddJsonOptions(options =>
{
var settings=options.SerializerSettings;
settings.DateParseHandling = DateParseHandling.None;
settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
});
读者注意:一些评论指出了这个答案中的一些问题(特别是与第一个建议有关)。更多信息请参考评论部分。
DateTime.UtcNow.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffffffzzz", CultureInfo.InvariantCulture);
使用自定义日期-时间格式,这将为您提供类似于 2008 - 09 - 22 - t13:57:31.2311892内。
另一种方法是:
DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture);
它使用标准的“往返”风格(ISO 8601)来给你 2008 - 09 - 22 - t14:01:54.9571247z。
要获得指定的格式,您可以使用:
DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture)
你可以用下面的代码得到“Z”(ISO 8601 UTC):
Dim tmpDate As DateTime = New DateTime(Now.Ticks, DateTimeKind.Utc)
Dim res as String = tmpDate.toString("o") '2009-06-15T13:45:30.0000000Z
原因如下:
ISO 8601有一些不同的格式:
DateTimeKind。当地的
2009-06-15T13:45:30.0000000-07:00
DateTimeKind。Utc
2009-06-15T13:45:30.0000000Z
DateTimeKind。未指明的
2009-06-15T13:45:30.0000000
.NET为我们提供了一个包含这些选项的枚举:
'2009-06-15T13:45:30.0000000-07:00
Dim strTmp1 As String = New DateTime(Now.Ticks, DateTimeKind.Local).ToString("o")
'2009-06-15T13:45:30.0000000Z
Dim strTmp2 As String = New DateTime(Now.Ticks, DateTimeKind.Utc).ToString("o")
'2009-06-15T13:45:30.0000000
Dim strTmp3 As String = New DateTime(Now.Ticks, DateTimeKind.Unspecified).ToString("o")
注意:如果你将Visual Studio 2008的“watch utility”应用到toString(“o”)部分,你可能会得到不同的结果,我不知道这是否是一个bug,但在这种情况下,如果你正在调试,使用String变量会得到更好的结果。
来源:标准日期和时间格式字符串(MSDN)