UTC
strUtcTime_o: 2012-09-17T22:02:51.4021600Z
strUtcTime_s: 2012-09-17T22:02:51
strUtcTime_custom: 2012-09-17T22:02:51Z
Local Time
strLocalTimeAndOffset_o: 2012-09-17T15:02:51.4021600-07:00
strLocalTimeAndOffset_s: 2012-09-17T15:02:51
strLocalTimeAndOffset_custom: 2012-09-17T22:02:51Z
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
...
string strISODate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)
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.Local
2009-06-15T13:45:30.0000000-07:00
DateTimeKind.Utc
2009-06-15T13:45:30.0000000Z
DateTimeKind.Unspecified
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")
Note :如果将Visual Studio 2008 "watch utility"应用于toString("o")部分,可能会得到不同的结果,我不会发现错误,但在这种情况下,如果您正在调试,则使用String变量可以获得更好的结果 .
public class BenchmarkDateTimeFormat
{
public static DateTime dateTime = DateTime.Now;
[Benchmark]
public string CustomDev1()
{
var d = dateTime.ToUniversalTime();
var sb = new StringBuilder(20);
sb.Append(d.Year).Append("-");
if (d.Month <= 9)
sb.Append("0");
sb.Append(d.Month).Append("-");
if (d.Day <= 9)
sb.Append("0");
sb.Append(d.Day).Append("T");
if (d.Hour <= 9)
sb.Append("0");
sb.Append(d.Hour).Append(":");
if (d.Minute <= 9)
sb.Append("0");
sb.Append(d.Minute).Append(":");
if (d.Second <= 9)
sb.Append("0");
sb.Append(d.Second).Append("Z");
var text = sb.ToString();
return text;
}
[Benchmark]
public string CustomDev2()
{
var u = dateTime.ToUniversalTime();
var sb = new StringBuilder(20);
var y = u.Year;
var d = u.Day;
var M = u.Month;
var h = u.Hour;
var m = u.Minute;
var s = u.Second;
sb.Append(y).Append("-");
if (M <= 9)
sb.Append("0");
sb.Append(M).Append("-");
if (d <= 9)
sb.Append("0");
sb.Append(d).Append("T");
if (h <= 9)
sb.Append("0");
sb.Append(h).Append(":");
if (m <= 9)
sb.Append("0");
sb.Append(m).Append(":");
if (s <= 9)
sb.Append("0");
sb.Append(s).Append("Z");
var text = sb.ToString();
return text;
}
[Benchmark]
public string CustomDev2WithMS()
{
var u = dateTime.ToUniversalTime();
var sb = new StringBuilder(23);
var y = u.Year;
var d = u.Day;
var M = u.Month;
var h = u.Hour;
var m = u.Minute;
var s = u.Second;
var ms = u.Millisecond;
sb.Append(y).Append("-");
if (M <= 9)
sb.Append("0");
sb.Append(M).Append("-");
if (d <= 9)
sb.Append("0");
sb.Append(d).Append("T");
if (h <= 9)
sb.Append("0");
sb.Append(h).Append(":");
if (m <= 9)
sb.Append("0");
sb.Append(m).Append(":");
if (s <= 9)
sb.Append("0");
sb.Append(s).Append(".");
sb.Append(ms).Append("Z");
var text = sb.ToString();
return text;
}
[Benchmark]
public string FormatO()
{
var text = dateTime.ToUniversalTime().ToString("o");
return text;
}
[Benchmark]
public string FormatS()
{
var text = string.Concat(dateTime.ToUniversalTime().ToString("s"),"Z");
return text;
}
[Benchmark]
public string FormatS_Verify()
{
var text = string.Concat(dateTime.ToUniversalTime().ToString("s"), "Z");
return text;
}
[Benchmark]
public string CustomFormatK()
{
var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
return text;
}
[Benchmark]
public string CustomFormatK_Verify()
{
var text = dateTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssK");
return text;
}
}
15 回答
=>
使用:
OUTPUT
来源:
Standard Date and Time Format Strings(MSDN)
Custom Date and Time Format Strings(MSDN)
我只想使用XmlConvert:
它会自动保留时区 .
如果您在SharePoint 2010或更高版本下开发,则可以使用
您可以使用下一个代码获取"Z"(ISO 8601 UTC ):
原因如下:
ISO 8601有一些不同的格式:
DateTimeKind.Local
DateTimeKind.Utc
DateTimeKind.Unspecified
.NET为我们提供了这些选项的枚举:
Note :如果将Visual Studio 2008 "watch utility"应用于toString("o")部分,可能会得到不同的结果,我不会发现错误,但在这种情况下,如果您正在调试,则使用String变量可以获得更好的结果 .
来源:Standard Date and Time Format Strings(MSDN)
返回类似2008-04-10T06:30:00的内容
UtcNow
显然会返回一个UTC时间,因此对以下内容没有任何害处:大多数答案都有毫秒/微秒,ISO 8601显然不支持 . 正确的答案是:
参考文献:
ISO 8601 specification
"K" Specifier
这会给你一个类似于 2008-09-22T13:57:31.2311892-04:00 的日期 .
另一种方式是:
给你 2008-09-22T14:01:54.9571247Z
要获取指定的格式,您可以使用:
DateTime Formatting Options
如果必须将DateTime用于ISO 8601,那么ToString(“o”)应该产生您要查找的内容 . 例如,
但是,DateTime TimeZone可能会出现其他问题,如博客文章_492050中所述:
要将DateTime.UtcNow转换为yyyy-MM-ddTHH:mm:ssZ的字符串表示形式,可以将DateTime结构的ToString()方法与自定义格式字符串一起使用 . 将自定义格式字符串与DateTime一起使用时,请务必记住您需要使用单引号转义分隔符 .
以下将返回您想要的字符串表示:
注意:根据您在最后进行的转换,您将使用第一行(最喜欢它)或第二行 .
请确保仅在本地时间应用格式,因为“zzz”是UTC转换的时区信息 .
DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)
应该为您提供所需的内容,因为"s"格式说明符被描述为可排序的日期/时间模式;符合ISO 8601 .要像 2018-06-22T13:04:16 那样格式化,可以在API的URI中使用:
有趣的是,自定义格式“yyyy-MM-ddTHH:mm:ssK”(没有ms)是最快的格式方法 .
另外有趣的是,“S”格式在Classic上很慢而在Core上很快......
当然数字非常接近,某些行之间的差异是微不足道的(后缀
_Verify
的测试与没有后缀的测试相同,显示结果可重复性)码:
https://github.com/dotnet/BenchmarkDotNet被使用了